TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - X& S" D, V9 ~* W2 w7 K
- ^6 Y X! {; O( s5 p/ W理了理思路,重新做了一个测试。
+ H4 \- F3 j* J' j/ Y做了两个 vector 和 两个 float *, 都长 1000002 Z7 V# d1 ^ _' F) X; u" i
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 W: g2 a0 s( r. I& M
/ n7 s% ^5 x9 `
内循环试了4种方法,, }9 l0 p L; K2 Z' t4 W
1. 直接调用 vector inner_product 247s % v/ i* [" p; j: s
2. vector 循环点乘累加 237s7 \0 l. \" G4 h* K
3. float * 循环点乘累加 204s8 z4 s: ~, [+ i! d
4. 空循环 100000 次 202s
i' K/ x* T/ w1 M; o4 }* p* S
% F, A& |4 k5 \/ \9 u不做内循环 200s
; I5 ~8 w( o: ]5 i2 |' i) L( `0 h& v) i1 R" t
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, D: t+ |) j; _* F
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ R& C3 T2 e$ L$ V0 ?$ ?
! q7 X$ d8 e8 q7 b3 x
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) d" A ^ s" N
% b7 N2 z7 N& Y9 v4 a
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- X6 _3 p5 a; _4 n) l/ G
" e" w5 @% H9 {5 y7 Y" }& W2 C7 J
std::vector < float > vec1(N);* u% I r: M$ s% V, }, e
std::vector < float > vec2(N);
) O* b: O3 G: y2 m6 @, O float* b1 = new float[N];5 i" Z2 M- L- Z1 S; M
float* b2 = new float[N];6 X. o$ y2 k" o& _
# S0 x0 c1 _+ @# H3 ?# Y0 m
for (int j = 0; j < 6000; j++)2 ^$ d8 i, F! W+ o: t# h2 n4 l/ b R
{/ l& `; j: e$ h/ L% N
std::generate(vec1.begin(), vec1.end(), []() {& e( v! c. e/ t/ c* H" M" x9 Q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
H; y/ w/ ^6 r+ Q2 R0 `$ f' i });) E+ E H. i, k
( Q$ ^. u3 r4 @$ Z1 m std::generate(vec2.begin(), vec2.end(), []() {
& L/ ]/ l! l ?8 | return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 Z5 N6 k; J' q9 s& T; P! u) l+ a' ^' s
});
- ]% z4 ~. t- u5 N4 Q/ e
1 q3 e6 |% |) U& `0 y5 f+ }2 R! } for (size_t jj = 0; jj < vec1.size(); jj++)8 G+ {; W1 G8 B4 L* V+ A
{# Y/ J6 a0 T; y: C% a# A1 N- b2 T2 u
b1[jj] = vec1[jj];
( @" z8 |& I- I% ~ }
! b) ` u( S5 `) a L# e& G g( C2 L; d3 A- Y! [+ g
for (size_t jj = 0; jj < vec2.size(); jj++): L; x7 |1 p2 [7 l f
{% ~ f# c6 N. r. ]7 E
b2[jj] = vec2[jj];
( ?' S9 }& H$ s& y6 }0 m( k7 M }
( y' [# |/ J3 X& D" R1 E# N4 b6 B( M
# R. k( y) S4 \ //Method - 1 N=100000 247s ! f4 U) ? S H
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ v- Y0 l6 g- O+ M) @) Z! \% { $ L5 \ w. j. b& T9 b( P& ?
//Method - 2 N=100000 237s
9 E3 C# @; t1 S5 w /*
# x0 @1 K# W6 p1 N1 ^ M for (int jj = 0; jj < N ; jj++)
9 L+ }# s$ s- ~+ _& X {) n- Z1 n: V6 T5 o
fresult += vec1[jj] * vec2[jj];/ w) f& P1 T1 r5 `, m- d" Y O$ U
}
4 v( ]) `6 d: Q */
& Z3 o' z' d+ C. g+ @ 8 N a& g1 \3 [4 t7 M" y
//Method - 3 N=100000 204s
9 ?$ E( O \0 |- w% u! | /*4 V6 ]% e4 B0 t; r2 h
for (int jj = 0; jj < N; jj++)
# \: o4 ]7 q) H0 Q( ]4 @ {
/ Q6 ^# t. F3 ~% F* E7 J fresult += b1[jj] * b2[jj];7 T& K. f$ Q# X" V& Y; h x
}
4 ]5 D( T, O! W3 _( { */6 ~+ ^3 A, p0 G6 `1 e
+ j, q% x( m5 r1 V1 x* o
//Method - 4 202s. ^$ M/ G& R5 |5 e* |2 U" N: N
/*! z8 S- B$ ?% G/ s4 u. m9 t
for (int jj = 0; jj < N; jj++)
5 t$ U6 G6 e, {, k {
2 a9 C- b4 I$ Z- z4 F - c p, R+ a7 J& b/ q ~/ x- P
}1 h. b5 k- T3 z' C7 c! D% i
*/" N9 x4 c1 V* w) f: Z5 U3 \. s
//comment out all methods, N=100000 202s
; y; N0 `/ p+ f) n }* j7 y; x2 ~0 w, B7 u( _( S
l' _$ L' v9 C' E% ` I
delete []b1;! q1 H- K. }4 w, }' a# P
delete []b2; 5 c1 g8 c* `: u9 Q
|
|