TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! ]6 m9 c/ h7 o" C" g! n; w
5 f" y+ ?9 e( f$ W理了理思路,重新做了一个测试。* ?( L: ^) M) u2 w2 b' B
做了两个 vector 和 两个 float *, 都长 100000* N1 M! V8 t' a. y, \
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* x" s9 C% O. G
+ E* u5 W! k. k; ]/ n5 F内循环试了4种方法,
, l f% Q' E' \ g5 _4 X! P1. 直接调用 vector inner_product 247s & b7 W m6 b. m7 p
2. vector 循环点乘累加 237s
& \7 c/ q* w0 F; r0 o( ?. z3. float * 循环点乘累加 204s3 z! m7 I9 [5 X" |
4. 空循环 100000 次 202s" V) O2 o/ M; ^( M. f) ~ e; ~0 C4 g$ _4 X
9 x* @2 G8 z. ~4 b% H8 y# t( {& y不做内循环 200s9 V, _% ]* H! p ]' K
4 b6 c1 F. ?. P; x你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ s) j. W6 z) j- Q
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) V& n* ?3 ^) f8 r- i( {
2 @9 k. E! w3 k+ n
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ s( Q9 Z4 H3 C( y1 {
3 D0 H! q2 ^: c" X
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
: c2 g" W5 L3 l: }! v# t0 @. T" b) {1 f7 x7 o. S
std::vector < float > vec1(N);. w) a( U4 H: M! h, h
std::vector < float > vec2(N);
. c# S9 n' W# m2 w float* b1 = new float[N];' l2 |4 Y( D" x
float* b2 = new float[N];& N( O# k7 {7 K5 Y( L8 |! b: s
9 W) q w4 k. [; \/ L
for (int j = 0; j < 6000; j++)
' w! Q( k9 J4 y: m7 I6 Y {( k {
( ~ x* b% `; [3 U8 ] c std::generate(vec1.begin(), vec1.end(), []() {' c+ V" P2 e9 J4 ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 b, O/ Q; n5 h' C, @
});
$ {5 b2 Q, |' j) t3 x# |1 s" j) I3 Q) ~( l0 w) d$ o
std::generate(vec2.begin(), vec2.end(), []() {
4 }( n* Q I( l: z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;/ c4 e) @ A2 a8 l0 ?2 ]
});7 k7 \+ |. H2 g, W6 |1 x
* d; U3 M. b8 T* [ for (size_t jj = 0; jj < vec1.size(); jj++)0 V! n0 d( k5 d, [% u, L
{
4 E W( T/ O/ v; o& ] b1[jj] = vec1[jj];; d8 Q8 A: |) L& T
}
4 k& s+ u# |8 r! r2 _ f; o( c8 ~, Q5 G, G4 K; P
for (size_t jj = 0; jj < vec2.size(); jj++)+ c. |# l5 L3 M- D5 K
{5 r, x4 ^/ Q x
b2[jj] = vec2[jj];
* N. n$ _) \5 q" u, S y% L; f }
! t9 e6 @4 r, D" n# C- m+ x$ u4 @: N, g, r% j2 Y6 x5 w
//Method - 1 N=100000 247s
* V- r" R2 h2 s% Q$ _: z& x //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);" ~! S4 V6 A A2 J! m/ G& O
7 c; f0 \1 a- U' Z //Method - 2 N=100000 237s' ^# e# p9 E$ q0 V5 [/ ]- \
/*
+ n& k& O( Q! j3 }% \ for (int jj = 0; jj < N ; jj++)
) T k+ k& q; O/ b0 f# k, q {
0 O4 [! B& m; L+ R, w" V fresult += vec1[jj] * vec2[jj];% R2 \& w7 S } Y) B
}
. H3 p3 b9 a. _' U */
: s8 E" ^0 S) p1 X( l d3 K- S, T
& u$ `: ]' |" s! N. c& t$ l //Method - 3 N=100000 204s# }1 V# `! K1 g# H2 B/ R# _
/*. c9 a6 ~+ V7 e# k0 g1 O. U
for (int jj = 0; jj < N; jj++)* d5 Q B+ G5 a6 H8 f
{: e; R: j+ t3 b
fresult += b1[jj] * b2[jj];
+ z4 p8 L( v: Q9 T0 E6 E }1 l' M: W/ s* X# D% l$ I& v
*/
' B& g w8 J# y ^5 O! q- s' e7 ?4 H" r% X& [: u
//Method - 4 202s& T6 }8 @+ B8 j: |
/*
2 k- i6 [/ N4 d$ X/ C for (int jj = 0; jj < N; jj++)
7 k) x, @7 y/ Y* f. k) f {5 H% h# Y" d5 \* ^4 _4 G
5 L! |' o# y6 {6 P! c }3 D+ k4 h5 d6 F" d
*/
k- q4 M8 |1 h3 s, f- S x1 @! [ //comment out all methods, N=100000 202s ( C/ t2 J& u8 e; X& |
}
* ~7 c, w$ k( H. z
+ G# O2 I& n& f N: l# Q! f delete []b1;
! Q, k% B/ M! C4 j1 Y/ r2 g# \ delete []b2; & ]7 H( ?) M& b6 p
|
|