TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
. Z! g; f! _2 q; y3 R; H- i# D1 X* i5 `: ~- D
理了理思路,重新做了一个测试。
2 t% {% x ^& V) v4 {3 ^9 R0 j做了两个 vector 和 两个 float *, 都长 100000
% V) u$ v t( R- `* h! B外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' ]+ l6 l3 {$ c+ I
/ y0 \+ ~; l* O: O" a' J内循环试了4种方法,
" E/ w; _ G5 i1. 直接调用 vector inner_product 247s
4 Y- p3 l4 p; a# {/ } d) W% X2. vector 循环点乘累加 237s' C& ?! N$ w7 d5 B- g" O/ ]
3. float * 循环点乘累加 204s+ O9 ]3 U6 d$ T2 U8 ]5 d
4. 空循环 100000 次 202s' `: X/ k; \) n$ L$ \
) E) E# t3 ^& n4 |! M不做内循环 200s9 p) ^2 I( _* J2 J* {
# ~4 }; K N) }* Q, d你昨天说的对,内循环本身占比是很小的,大头在其他处理。
" [5 E. A. @2 W# f( y2 Y. Z7 {/ Q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; q$ q7 `& b6 H, b2 d$ M
N* r" ?+ W0 n+ Z7 X$ G
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 d; I3 ]: x9 [; k. ^5 \( \
" c# C. }/ K6 w% Y# ?) \
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
' {! j( \0 K: l0 T9 }* Y5 [4 V2 ^6 x7 S3 \0 L- }
std::vector < float > vec1(N);
1 ?* Z+ s4 j0 \: v/ K( O std::vector < float > vec2(N);: M* F, \/ S2 E* ~( H. j
float* b1 = new float[N];8 N6 E/ e! |1 O, Q/ r$ y9 ^
float* b2 = new float[N];
- i: [, O6 T" J9 |$ M( M6 ^) l, M& G- o7 C. V4 C& B+ x, ]
for (int j = 0; j < 6000; j++)7 A; a# i. X9 V& }3 j& ?+ K
{* x4 t4 H: v$ i2 d" E; E. K% i
std::generate(vec1.begin(), vec1.end(), []() {
$ J! K$ S6 F3 B0 h( W! ^6 b# | return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% G' Q# ]) S i% q) t, _ ~0 e
});8 k* p6 C7 b; K. G: p
7 `, t7 h W, I
std::generate(vec2.begin(), vec2.end(), []() {2 M- _7 N& `) n& y2 @: a+ _* ?
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ j& z4 S A' j x, o; l
});/ ^: U! k! D8 i. q3 N1 `: X, y
+ w' R3 T% {5 ?9 E) W for (size_t jj = 0; jj < vec1.size(); jj++)
$ r6 @7 f( `5 K/ v {. g3 a+ F. W6 `, i7 z2 M s
b1[jj] = vec1[jj];
: I! V/ w* B' e6 x- @0 B! r7 V2 L* I }
. i* N- d8 k9 a) f% a8 z0 n q0 P4 c$ h# t3 @' N0 n A
for (size_t jj = 0; jj < vec2.size(); jj++)
0 i! B. u. g) ^ {
, V( ~7 A7 ~- c3 I6 q" p! N b2[jj] = vec2[jj];1 H- Y& `; w! M
}
1 T. m4 ^; a$ ], y# A( f! L4 U0 a h3 A+ M" S* t6 N2 Y/ U, @
//Method - 1 N=100000 247s * r- x; V1 z3 N2 q# |& ~1 O/ [
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 y" w( O( x7 Y' ~* d- B" X
+ Y, y3 l B r- t' e //Method - 2 N=100000 237s" `% t. I) J9 F n& ]$ K
/*
/ J# X" K7 p( ~8 k for (int jj = 0; jj < N ; jj++)5 c9 w- n/ U: g: S r6 t$ T
{
3 s. ]: {7 ~4 Z fresult += vec1[jj] * vec2[jj];- z- k4 x3 L1 H. _
}$ r3 w0 G4 J& j5 l/ A
*/
7 I/ y% }( @9 r; N9 `8 L4 v " T, L. ]) T) e) B9 x
//Method - 3 N=100000 204s
+ x' d; e, w N. j" B4 [ /*# u0 J7 s) X* V# }2 ?
for (int jj = 0; jj < N; jj++)
: E8 B6 |& P6 C& S! C {8 S6 O$ ?- r1 v6 w& a
fresult += b1[jj] * b2[jj];
/ z, a3 O( y( ~' _$ Z7 X }/ T) q3 F# f$ v# K! Q
*/
; M2 _' u( L! q0 X. X
) v& M. E: c& N3 Q' r //Method - 4 202s
8 ]# W3 \; U3 f) T /*& k; m @. k: J( k: W4 i
for (int jj = 0; jj < N; jj++)1 H7 s3 |8 X2 r( ^8 X3 L! B# n& Q1 g
{7 M+ G/ O) ~: G K ?" ?8 S
' Y7 m1 u+ \1 d# z) W4 L
}
1 R/ Q/ D; }) S* | */
4 d" P( {" d8 G" d //comment out all methods, N=100000 202s % G: ]4 n( w8 A G7 e4 p- f! }1 K
}
. W0 G! K4 {# {% G% }* o2 e- G5 W( N7 Q# L" A
delete []b1;" W, V/ K/ |# c& \1 X! ?& B
delete []b2;
2 u4 q% b) H r+ q. c |
|