TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
; i6 |) ?; p3 F7 A1 o8 c9 y: y0 K2 P; ?. T9 D5 @" r1 H" Z
理了理思路,重新做了一个测试。
) e# u7 x A6 X做了两个 vector 和 两个 float *, 都长 100000/ b+ j6 C, O& J$ s1 Q- w) [
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
: w% }5 I4 U/ s" [# v
4 T' e7 |6 x; a3 X内循环试了4种方法,
. O3 h1 s: `9 D, F/ X1. 直接调用 vector inner_product 247s
5 N! x! u9 m& T' d2. vector 循环点乘累加 237s1 l% K* w( }: {& W' l
3. float * 循环点乘累加 204s2 T0 o \2 x& J# O6 P
4. 空循环 100000 次 202s" X! B% c: k) W {7 }
: U e& n. T4 h6 u c1 D- q8 _* t
不做内循环 200s
4 g% j( |! N+ e3 _; e0 Z6 x( M, m8 F; h' c @% X8 X
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( E. C8 {8 G8 z+ P+ Q! w8 v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 O5 c# V2 p( Y2 R L& f
3 q( g9 C! Q: ?) |+ G至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 \: V8 J; { T; o: s, D: A
* r* S+ S e$ a: f9 y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 J' L# |4 M, L. N& ?- J7 Z5 F1 _
std::vector < float > vec1(N);, \7 o# x/ ]8 X
std::vector < float > vec2(N);
! Y# m$ V/ \, Z- S4 t. e float* b1 = new float[N];( d) @4 j) N) V2 {" @/ ]% B
float* b2 = new float[N];
6 b7 k g Z0 e
. @3 f% o& q3 `8 e& G5 ] for (int j = 0; j < 6000; j++)
2 d1 z5 r5 n: |+ N {, D0 L7 v! u; L0 }9 M
std::generate(vec1.begin(), vec1.end(), []() {4 Y G& X& R5 C ?/ ?
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ Z; \" W5 m0 B6 f/ t% h3 I });
) q# q# M7 Q0 P6 Q3 {# Z( B' \2 V
$ T, _+ W: a! ^$ D& E @ std::generate(vec2.begin(), vec2.end(), []() {
& q' U# v& G) z3 \( [* c0 L; v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ |3 y# y. x; G* A
});
+ j4 k& ~0 X A4 O* U
& s- Q4 c% L) X" E% m5 o) n4 O; k for (size_t jj = 0; jj < vec1.size(); jj++)
: s% T6 R$ u+ ~% W: I( Q# R5 j5 H' Y {9 I4 F& w* k' ^: \
b1[jj] = vec1[jj];4 C; [: X( w; P- H) C
}
0 u8 P# K& f+ q0 b, `5 @" }" J3 k7 S" @/ F0 N( n
for (size_t jj = 0; jj < vec2.size(); jj++)) H/ Y7 W- F. Q
{% ?( L* ^. W( C/ v+ \6 u2 k8 y
b2[jj] = vec2[jj];& d5 ^; @+ ?% E( s, X
}& H& Q5 A! K4 k, e# u( s8 j0 q
! D. O! J& S: G, `& u a
//Method - 1 N=100000 247s 1 f% O% z3 m0 g ~# Q! o7 c
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);( K$ }) `, x1 ]' b+ K' k9 l% g* H
7 `& g; n' q6 V7 ^ //Method - 2 N=100000 237s
5 [& L1 l- G9 \ y9 W /*
( B/ J0 J( A: A* d5 _4 M5 W u5 n for (int jj = 0; jj < N ; jj++). `' b9 Y0 S/ F1 l
{
) L( s5 M0 l/ N! n( n4 W/ u fresult += vec1[jj] * vec2[jj];
: R. t: }6 p$ ^8 G" V: g: {# @3 c( X }
) T* f8 E$ v" y! l( D! Q) @ */
8 M/ b+ M- w9 K! P; ^9 I
- W( a/ F1 p( H3 E, N+ Z, ~2 F j //Method - 3 N=100000 204s& u. ^; y9 I3 [; ~& r+ Q7 y
/*
% ^$ F2 y c# ~( I for (int jj = 0; jj < N; jj++). B- t' K% A; \. i* b
{
2 a' u/ F% g% ~ ?" r+ c$ M fresult += b1[jj] * b2[jj];! ^, g, U8 f! d3 V' c; ^
}
! [4 v5 W9 A' L" v1 Y */2 ~2 r" u2 B& m, @( i7 `/ A/ f
8 k8 H) [! k! P
//Method - 4 202s
6 o4 H: J& z8 g( z /*
, B6 D u+ h+ H6 d. S! I% m for (int jj = 0; jj < N; jj++)
" X: I+ p+ o' ]. g; }5 |& g {
) e( C8 `2 Q- h. ]6 b
8 Z# U/ `1 ~1 Z- E }
8 d B, Z% q' y4 T7 v0 V1 C! m */
7 |' n7 `( N# t2 t) W2 C //comment out all methods, N=100000 202s ' s* u0 {* R2 I0 F" u* ~% {
}! ?- Z) [4 J1 f
) f5 B2 H4 z) s$ p5 A
delete []b1;+ p2 G* ]% j0 @, o. D
delete []b2; ! Q5 w: c9 K. f4 Y
|
|