TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * y' r6 L$ u6 o4 t
5 s" J1 T [) G( U理了理思路,重新做了一个测试。
# q5 v' x: R4 Q做了两个 vector 和 两个 float *, 都长 100000. c" _% X& }/ g3 Y I8 M1 g, g
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
, J* M( [9 J6 o' r+ @( U
% Q5 q1 ^. }" o+ R( X' U) W& a# k内循环试了4种方法,; F. y$ ?: k( u4 R6 y" M$ P9 ^2 A
1. 直接调用 vector inner_product 247s 7 m* X" k: v' R3 {1 ~( J
2. vector 循环点乘累加 237s
" N+ {( E& X! G( t3. float * 循环点乘累加 204s
% h! Z' P e. B6 Q' T& _% ^9 E- v4. 空循环 100000 次 202s/ ?% q& D% x; w
4 i8 G) h4 v4 R6 ]1 c# y- w不做内循环 200s9 g) m8 g- j2 A9 @' z
) C; p' f! y6 \' p4 v
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ D) L, W9 I- m; V, r3 S! ?% {另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- y* D% L6 t, q+ `1 L$ r
5 Y* m: o& {2 q& L
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* P+ v! T0 H' Z0 b! v4 J; {
9 U d( Y. M) b6 O; `0 h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). I l" l1 w1 A) u
& j/ b2 }) G1 q" t1 y
std::vector < float > vec1(N);, H% R2 S5 z2 H, x9 W5 p
std::vector < float > vec2(N);
7 W; E9 \0 n1 E9 o" _# [' j+ F float* b1 = new float[N];4 j: Z: k8 }) h. S
float* b2 = new float[N];
0 Y" l$ G+ z9 W/ R4 H& C7 [5 | E* w4 e! D! Q7 X4 q
for (int j = 0; j < 6000; j++)
" z/ w; f2 D% R {
7 B$ y3 X4 m& E% V std::generate(vec1.begin(), vec1.end(), []() {
# Z5 B* x, D5 @ ^ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 M8 g: L$ m8 c2 T
});
. X& D' Z$ ~2 ^/ F4 Q- J- b* `1 f3 ]' N a
9 J) y! x; J/ G) q# \ std::generate(vec2.begin(), vec2.end(), []() {
. P1 F5 F( }! m) A, Z3 P return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 c4 s. H6 ^9 f" m6 U
});
6 u0 x! d# V- Q1 `; {; W5 T
! c: x, n) U4 r# D- d for (size_t jj = 0; jj < vec1.size(); jj++). o& x3 a& s4 T4 j( ~+ q
{
]5 n/ N8 I1 |4 D b1[jj] = vec1[jj];
5 n; |0 N( X5 u }% u, t' U/ q& i! T1 t5 ?- K
. V, G- k+ o9 R6 l4 S( I for (size_t jj = 0; jj < vec2.size(); jj++)
- h6 i7 p7 M" I T {: A9 y! ?8 p5 u8 u6 t2 `2 K) o* f
b2[jj] = vec2[jj];1 D3 R- \4 b) f# k% _! e, \
}. |; g$ t% F3 P& q
! y, t# z1 V* ?: }2 z% _1 @ //Method - 1 N=100000 247s ' t ]! W0 x/ U( r- z2 x
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 N' v, Z3 H9 m4 Z. Y2 h & a, `& o: w3 U+ S- g
//Method - 2 N=100000 237s8 |; k( T: O7 H, v& F/ F. @, Q) @# T
/* i$ E; i. y6 r0 `- z
for (int jj = 0; jj < N ; jj++)8 r- O5 ^( x: _, k1 K
{
, `( m& F/ N+ n; ?# A2 ^, _& b- Q fresult += vec1[jj] * vec2[jj];
. c, S& A o Y0 W) n }+ C7 y& ]( B O, j; g
*/
: n1 o3 e3 I! u. ~7 c
; |3 X8 E- l+ l# D //Method - 3 N=100000 204s
1 i, r5 m$ \$ ]$ n' ^ @+ q /*
; ^% T* k$ p0 r3 i0 H for (int jj = 0; jj < N; jj++)' s6 G/ P# V2 n0 A% ?
{
& y- n$ j" A& ?. C fresult += b1[jj] * b2[jj];$ p: D) t3 o( I4 b. \4 \, [
}2 r% L# P1 j8 n+ j c& d O
*// a$ Y; [! G1 W8 ?
$ l$ {) ^% z* o$ [3 P //Method - 4 202s
% D: b5 y+ m- G1 h$ P+ g /*9 k' d# T0 N& {
for (int jj = 0; jj < N; jj++)
& T F- i1 k* A# v: [ {9 ^5 v% W& T2 @
" ~' g+ [9 P" b2 o7 @2 m+ Y
}
1 D* t& M& p8 ~$ v6 L8 F H8 u */+ K, y- d& o4 G7 Y8 }, S% h
//comment out all methods, N=100000 202s ) o, q% b T" t2 l7 s
}
; B8 z0 x6 N# b; V9 y- g
1 g! c" n3 m5 x' e# T6 v delete []b1;* d: g/ q$ Y) C# g5 ^0 _5 G, H
delete []b2;
7 P( y. T6 `* X" W4 U* n7 @6 S |
|