TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - \: I3 { r6 A
5 z+ @; }! B. A% f1 M理了理思路,重新做了一个测试。
, m0 z, C4 Y. i' a做了两个 vector 和 两个 float *, 都长 100000
: c5 i3 i. L: {1 i0 i外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
# |$ c5 p4 R/ i& N! S
2 s) r {* a/ _6 n# w内循环试了4种方法,9 N; P P9 l$ K1 G8 l
1. 直接调用 vector inner_product 247s
+ C2 f) T; b/ ]9 Z, \2. vector 循环点乘累加 237s
* D' v0 }+ {% P2 r" F0 z/ t2 {3. float * 循环点乘累加 204s
: p3 C) K4 E2 k/ f" J& T5 A3 W: }4. 空循环 100000 次 202s; V# l/ C$ U4 `8 t1 f
$ L* F1 G D% L9 m+ F
不做内循环 200s
3 H) A e2 Y8 D) S [& V0 W$ d. z2 z" Q; O7 R: k g
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
) }7 ?- j* B* u. i另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
$ t" Z4 Y5 O0 V% H% l* T0 t n4 v$ K4 `! \8 }
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 H0 ?6 ~" J% O* \, ?
1 ?; \2 }5 S! X' u$ O2 F(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 v" O% e Y& i6 Y5 m0 u
0 s. d7 e! ]6 g1 [ std::vector < float > vec1(N);( V' a4 f! k# _$ F
std::vector < float > vec2(N);
3 A8 Q: p* v$ L$ `4 K float* b1 = new float[N];
; v7 [$ |1 {+ V* L float* b2 = new float[N];0 s. y9 W& } \( v; `
6 P7 s, F' T( F* j/ b for (int j = 0; j < 6000; j++); V8 W9 i- D9 h" N' }
{
) h0 R# S, D" ^ std::generate(vec1.begin(), vec1.end(), []() {$ Y' Z8 `8 M$ }6 n! D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 `8 E1 w' i- j7 }& ^" h });4 } p, L4 D% |1 ~- h6 V1 y
0 c+ r- R( C- t0 U a4 }) m9 v std::generate(vec2.begin(), vec2.end(), []() {! E B$ m+ I6 J9 Z% ?- l' O
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 ?/ j# ]& k) } });
- i- V% V# T6 P+ C( z9 q
0 [- m- S& R* @ for (size_t jj = 0; jj < vec1.size(); jj++), D z4 j, B! V, e4 k" S4 Z
{
- {, Z2 k; N( u b1[jj] = vec1[jj];
! v* K/ J0 `! m/ I5 R! k3 c# e' M: N/ K' h } F( m! f( b# w; L3 j
8 X; f& {' r2 }5 R
for (size_t jj = 0; jj < vec2.size(); jj++)
3 B" I$ w( l' @ {5 i6 m2 j" K; N2 X2 w
b2[jj] = vec2[jj];
& E2 A6 Y$ h8 i- M }
4 V8 w8 N3 J9 m4 i% b* h4 m2 L
: n4 u. L) J" l6 N) q //Method - 1 N=100000 247s
8 C- z. L4 U+ T' {1 u+ i //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
4 I [0 R* H1 b: j5 K
7 ^1 w1 p* z4 [ //Method - 2 N=100000 237s
3 S. R( L: [8 x8 n2 A& { /*7 F0 K; {6 r& z; E7 o* z
for (int jj = 0; jj < N ; jj++)
/ A% ` J8 I6 P {
( L; w% Z, y3 D fresult += vec1[jj] * vec2[jj];
9 w! n! q2 d- T0 | }' P0 A' w" [8 O$ M
*/, o4 q( T" |6 q: m
+ N8 V2 j9 W; }: N3 q8 c
//Method - 3 N=100000 204s
5 Y: J. S. N: i2 ]: N. X! ?8 q /*
1 I3 s N6 ]8 v+ z8 J for (int jj = 0; jj < N; jj++)
! ~+ F7 M# _" D+ H+ c {8 N8 c8 v. w& U* q+ ^) Y5 U1 r
fresult += b1[jj] * b2[jj];
. F! o j, J9 b; d$ H }
* x" ^8 k+ x4 U+ C l% q+ r */
" E* N9 ^- a) m8 x& W( t
( q: M4 b- N" O9 U, }/ u; G //Method - 4 202s1 G' `3 ?+ J" X
/*' g- @+ R5 c" P! Z' |
for (int jj = 0; jj < N; jj++)( `/ n: S! x# K X; @6 T. k; i
{- j; c9 `( H, D! D; r/ ~$ ~7 \
5 y7 I* D1 r0 o4 P }
4 k0 p: s- d& w( H */
2 _- j, N* X- g% b Y5 T! y //comment out all methods, N=100000 202s
' c2 v6 P' O1 A0 Y8 U' ]) P3 s5 ] }
3 P% R4 \/ u9 l7 V( F
$ b3 R( p5 m% d delete []b1;
2 h- _4 W; g8 @6 W3 a( m4 S delete []b2;
: t, d7 c8 l! }4 A, Z |
|