TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 % j3 J0 j. k+ S+ H" _
& F' _" s3 Z; z. V. B; E( D; J$ g
理了理思路,重新做了一个测试。8 H+ r0 c j* I0 h2 L6 W: t
做了两个 vector 和 两个 float *, 都长 100000# C1 [4 S9 ~6 Z; Z0 @
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
% m; n/ v5 R$ Z% D$ u
) i) }0 I% I1 B y2 u7 i1 [内循环试了4种方法,. h9 S! w" A% L2 j$ X
1. 直接调用 vector inner_product 247s
* G- ?; D; H7 R5 P- H/ o+ I" F5 y3 P: `2. vector 循环点乘累加 237s g2 n/ h( _0 Y8 u" `% K* i. |
3. float * 循环点乘累加 204s
3 t" F. Q' o) c. W b# W4. 空循环 100000 次 202s3 I5 s+ C) D2 h5 J' ~+ h
6 Z2 M% h% K; Y x# X" b( K; N
不做内循环 200s
1 [, D6 I* ~6 _1 G4 r( ?) }6 N) a0 V& x4 E2 |3 c! v5 N
你昨天说的对,内循环本身占比是很小的,大头在其他处理。 H0 S& m# }- w! o4 E7 X' W
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# s9 N/ g/ }$ L
+ [5 O9 i7 Z- g4 @ P0 f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ k }* J/ V& W# a7 f2 F
: b: f) c, H) c, c/ e: }
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 k2 }" ?) @4 C5 t# Q7 Q% H
" U. p" ~0 E: M$ N* m8 F5 i, u std::vector < float > vec1(N);+ M4 P, ]" c) Y3 s6 k% Q
std::vector < float > vec2(N);
0 y) x7 V w# Y' z float* b1 = new float[N];
( ~3 [$ I) Q/ u8 J float* b2 = new float[N];/ o ?! o; L2 e+ _* o+ |( L) v
; k- E! l9 B( R' @ for (int j = 0; j < 6000; j++)
9 j) [8 h2 u r5 Y* d+ w4 J, `* U {; d9 t. b4 S/ c! z' h
std::generate(vec1.begin(), vec1.end(), []() {: ~+ g# H% E- c0 u( L2 C! h n' z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" G0 f* l: `# O H l/ G) g$ v });: U9 s: K, R1 ^4 X- z; I2 F( W
0 }; R4 Q, f9 \2 q0 n" b* ?7 l
std::generate(vec2.begin(), vec2.end(), []() {& E9 N% |# n) ?1 X9 y9 ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 p+ T) { m0 i" t! n% X4 T! O
});
( i% Q( s8 {/ y. y+ Y
. T4 |' n& k' O* Z5 ~- d- E for (size_t jj = 0; jj < vec1.size(); jj++)
# Y1 j0 }, H ?: M5 @$ G' _; e# W {) R& o8 l8 Z0 \, ?" T
b1[jj] = vec1[jj];
: d( f) {/ r/ k: X! Z" Z7 Y }4 y7 S+ {' Y5 X% r! ?* \/ Z4 M9 J
+ ~" o" b, r6 x for (size_t jj = 0; jj < vec2.size(); jj++), X# h8 n: ~' |8 S8 y, Y% s) G$ E
{, h2 A1 v* W( u/ ~
b2[jj] = vec2[jj];! C3 @9 D( }, Q% ?
}
" W; u/ H) a, \2 f: M0 T% S J
2 S" O! i) P3 I/ d8 ] //Method - 1 N=100000 247s
. @: F/ q ?9 _ y! i //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
; H' W$ D( S% L. f8 q " g" {0 I! ^( O1 R- E1 a2 b
//Method - 2 N=100000 237s L2 B+ q, q$ d# _) K/ V% x
/*
( E' m; Z4 B, C7 L/ {* t for (int jj = 0; jj < N ; jj++)
0 C, ]5 C1 m w1 P) o% o {* k3 R- _: p5 s' U* H
fresult += vec1[jj] * vec2[jj];
. a7 s; | @- ~$ P. o0 o/ N$ `& C! j. y }+ ~9 u# k% F' L* ? E
*/
`) V1 b, K5 a9 q/ d
3 D* [/ S/ V) v //Method - 3 N=100000 204s: X* n' ^: O9 w/ K) j- {3 m
/*
+ K6 U% G$ U+ R. ^3 A0 f0 V for (int jj = 0; jj < N; jj++)- g9 X4 r2 |9 V4 T- j5 B
{
3 d+ U8 f8 K& p fresult += b1[jj] * b2[jj];, n# j0 s4 U! f: R; u
}
( \) \* F6 A! U3 K */
( y) a* s8 }* e! \7 O. O. C% L
) x: n J6 i( l: Y //Method - 4 202s
. h- _+ Z; W* G /*
$ L% O I# l2 ~: I w( w for (int jj = 0; jj < N; jj++); E4 K6 k- E% s: D8 a; S4 R
{* w+ F, s5 ]. B
# C: [1 i5 f6 I: [6 e6 b. h0 i. l
}, i3 r; h" P9 b' `& ~; C
*/
/ ]. l' o9 u! Q* j$ t4 T, U //comment out all methods, N=100000 202s # Q4 x! w4 K. p- x3 w
}
5 b& X" {1 o2 F# J
; s0 \# P) O2 h' s delete []b1;
9 D: S( L& F: {+ L: |2 Z! j delete []b2;
5 O2 w1 e8 T0 k( n0 A |
|