TA的每日心情 | 奋斗 4 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 " h. B: p$ p$ W8 r' O, Q; z+ E
) i6 n/ l1 a/ [( H: w$ D4 ?* ~
理了理思路,重新做了一个测试。3 c; L! q) H3 y4 b( J& N6 o* q
做了两个 vector 和 两个 float *, 都长 1000000 c0 B2 z1 q* W
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." y5 T0 V9 k. r
' U0 V, s, \8 s" x1 A内循环试了4种方法,
4 Q8 h$ S4 c+ {: f: H1. 直接调用 vector inner_product 247s
4 R$ s; a2 ^. V5 N; d9 w2. vector 循环点乘累加 237s0 ?4 `7 }* Y) E7 `) B: J' F
3. float * 循环点乘累加 204s
* h- L) Y* k$ _# t5 d4. 空循环 100000 次 202s
3 N. p- p! \' j! R6 v7 R5 u; _- k1 v- d y8 \8 U- z+ ]! U
不做内循环 200s
& P) m( }" y# j5 n) g! ~5 W' I% V4 w$ u0 K
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
7 j" F4 w4 P: x8 s+ P4 ^' X另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
3 k- t9 R! @8 X1 E- ^6 [9 T! a! m7 a" y6 J$ t9 O( d2 g, t. p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* @* @3 C- b1 z$ N/ T! L
" ]4 c4 q4 T j, U(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 f% Q4 R6 x" t0 K$ S; B. K: _
/ @& Z6 P0 B+ H) M std::vector < float > vec1(N);4 A# G+ _7 D) w/ E
std::vector < float > vec2(N);
( H. ~/ m7 i5 c) ~ float* b1 = new float[N];4 W% I; b! d! y2 W) i. `
float* b2 = new float[N];* J) q* D- H3 ^; h( I; p, i- R
7 ~' Q& \3 ]8 _6 V+ P: Y; [0 s1 b for (int j = 0; j < 6000; j++)
" B$ Y' ]7 _4 O% x4 w" b {
; T! r2 c% W4 k, s! a std::generate(vec1.begin(), vec1.end(), []() {9 E8 \& L4 w3 d o X' K# t
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- O5 Z! P# S; H$ u9 D* f });
" x3 H. S& b0 P& c
8 ^: ]! u8 u. D- X& g std::generate(vec2.begin(), vec2.end(), []() {2 ?2 i" m6 L c s
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 `" E3 N8 [. p, M
});. h% L8 S! f& {1 O' M
* x' b2 J9 x* ~- m! e# }$ `7 Z8 B' I for (size_t jj = 0; jj < vec1.size(); jj++); A$ F) V" j- l8 Q1 ], L- B
{7 O: ~5 _( [8 K2 x
b1[jj] = vec1[jj];
4 g, _- V3 M- K }
8 O2 K! g% _: |* N& @% o$ `# K6 L) \: @
for (size_t jj = 0; jj < vec2.size(); jj++)
: o% Z. g u4 R* W+ P {" V5 o. v Z& p0 G' m
b2[jj] = vec2[jj];
3 D$ |: I2 T" B/ V# {, R }. n2 P( r8 o" K3 Z/ h& s- ?! v6 n- Q
) I9 M- z" L7 _+ s! b2 R9 y
//Method - 1 N=100000 247s , X; j3 V7 B& M0 t0 [
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ o" \2 u! X P9 m8 w+ `4 I; H* @" V+ n
1 e1 W. i9 o% B //Method - 2 N=100000 237s. I# C( b6 {8 @6 L, s% r! K
/*( X1 Y4 p& _/ Y$ y. J
for (int jj = 0; jj < N ; jj++)9 ?& l/ ]$ Z3 P5 U# W& C" d) e
{
7 p2 Q& Z0 x( z* _+ A. n fresult += vec1[jj] * vec2[jj];
- q& M% n# Y9 j/ C# d7 j }
. U6 k X! R" |7 A# n9 U ^ */
8 T2 r$ u$ I/ g- p+ ` ; ~/ s8 _5 q$ \- \7 S j
//Method - 3 N=100000 204s l/ |8 z2 G# ?4 a7 f: g8 ~
/*
1 V$ J4 G A( {4 i9 c$ { for (int jj = 0; jj < N; jj++)$ j2 a( B! { ~0 P2 V, _
{
" i) E! [# w% n" d" D! V+ { fresult += b1[jj] * b2[jj];
: |3 i! J/ K3 C1 Y }8 }; L' C& f# J7 I/ v8 q% b# }
*/
- Q& B5 S, J" s. x% F0 v v/ e/ K
* t+ f5 m3 `3 m p) N8 O //Method - 4 202s6 c& l$ `# W8 U9 M! J B' g" h
/*3 m4 @7 G; Z8 d2 R# F0 o5 J9 o
for (int jj = 0; jj < N; jj++)
% I! W% I2 n& T7 ` {
1 W% Y/ g$ r6 \. w- P4 ~% j * x* P0 V# p" ]: e- j1 `
}
9 r, x7 w' \$ z */
# m; g* ^* \2 c: }" r1 R //comment out all methods, N=100000 202s ) j- A! p& D9 S/ ^# D7 s' [
}( u; d! D6 u3 J$ w3 ]/ X
1 ], Z x/ [0 h1 a, | delete []b1;
4 G9 Q7 Q2 ?* k- |; ^ I( _: T delete []b2; 9 A, q+ S8 F" g+ R* H3 I% C
|
|