TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
4 D4 U2 B0 s) A- w) E7 s& C1 t2 H/ |7 I
理了理思路,重新做了一个测试。
3 ]0 R; q* s$ E3 Z* c做了两个 vector 和 两个 float *, 都长 100000
/ a1 A9 s6 n) q f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* X. R7 G* g: l$ ]* d0 K% _3 H- e
( Q: A9 e5 B2 a$ O1 u内循环试了4种方法,, s" b+ h/ j) C' P
1. 直接调用 vector inner_product 247s
! Y' X: K, _* H! F' o( y8 e: |2. vector 循环点乘累加 237s" X% `) u% F5 I8 ?
3. float * 循环点乘累加 204s; ]3 Z9 d. X- t
4. 空循环 100000 次 202s
- O) k5 w* c# V- ^" f* N2 {4 m5 k: h- z' y0 R: O! P
不做内循环 200s
' v, x# i# j) p+ D$ p# v1 C/ ^" F+ F- u
你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 `8 b+ N6 S- {. K) O
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 Z! Y" _6 F4 x9 w" J4 r
; o% f7 u5 ~3 R7 v0 ~' g8 X2 E
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
: k5 K4 _' W4 O+ z: w- x8 L1 U0 }1 z% J2 P* P5 J q
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 _/ |& M6 q/ j: }
; j8 K2 z& w3 ^) L8 q std::vector < float > vec1(N);4 v+ G7 o0 T3 H
std::vector < float > vec2(N);
0 ~& ]; F! B. L1 c1 L float* b1 = new float[N];
8 p" S% @* Z% l) } float* b2 = new float[N];
+ R! C) H7 z6 M0 s B- ^6 k
5 |* q' ?( |/ @$ X& j T$ t for (int j = 0; j < 6000; j++)
0 f s3 _/ } }, S9 R. |+ P8 k1 K {$ ?% G3 i2 |1 K! z) w! a9 p$ q% K
std::generate(vec1.begin(), vec1.end(), []() {. P4 M+ b- T$ y# s) T* Z8 V. x( L( _5 G
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; ?- ]2 E% e/ Z9 W+ W: U1 r: _% [
});
' F5 X6 \* A8 f7 X; c1 x% x% Q: O3 K7 U6 }
std::generate(vec2.begin(), vec2.end(), []() {8 s! m1 L( }, L9 [3 p7 Z% h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ ~3 v. w" L- E' f/ b B: r; v
});. ?* R% A p3 J; W) _3 ~' [: v
5 d+ F3 V) ?2 i for (size_t jj = 0; jj < vec1.size(); jj++); u. c' a# E Y1 z; \( p
{
/ C% D) n! u* Q+ W b1[jj] = vec1[jj];1 [. {6 j* k7 z" m8 y
}
?9 {0 S" h) |! `! e+ U" A0 @
- R( |0 o( H& R" N7 }8 w7 f: U9 v for (size_t jj = 0; jj < vec2.size(); jj++)
9 W. X3 ~: t9 T6 G( B7 z# o& h {
( d! u; }$ }" f7 {7 w; _ b2[jj] = vec2[jj];. t' v7 ?2 w5 U, O) [- k
}( a# T: l/ U9 ]5 A5 E. W
6 I0 A# s1 M1 I: g9 Y //Method - 1 N=100000 247s
) e0 J0 o. R- g! s3 X0 s) w //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* d5 q. [% Q2 x: k! t2 n
5 h2 ~# D2 {5 [
//Method - 2 N=100000 237s
( ^6 h: d7 U5 Y! [8 V /*; x( o+ l+ s" Y3 b$ r, H
for (int jj = 0; jj < N ; jj++)
7 A( B& Q4 J, \/ |, F% q {
# p& r- Q5 x9 v( h. |6 d fresult += vec1[jj] * vec2[jj];
1 D: s, W& t4 n0 {: q }
9 \0 s, Z; Q" G1 O */
6 k5 L5 S) c, x& X5 `- l
. x8 L3 A8 z1 z //Method - 3 N=100000 204s
+ R3 B: B9 K9 I( B' i7 p /*. E+ i; a' Y' X8 u
for (int jj = 0; jj < N; jj++)
; ^0 F% b- y8 s4 A {
1 Q2 U' I, @3 _% e; h fresult += b1[jj] * b2[jj];1 t$ g5 s! j* y; D
}
3 Z* U0 P) W, H6 J */& x) a2 X0 h4 @7 e" S# z2 d* L
# G/ p: a5 S& r6 v0 ]: p8 ]$ n1 _5 c //Method - 4 202s
" u; w+ a9 G1 K- c# R* n /*
8 G. o/ ~* w, r' x- ?, F& i for (int jj = 0; jj < N; jj++)
$ B8 x, k7 f. F {3 g/ C7 L7 K" F( L) V
. }3 p: {3 w5 E$ d5 R; L }# S- P9 E8 d0 H6 E
*/; Y' v3 s/ _/ }' y2 q
//comment out all methods, N=100000 202s / r- e" V, x2 w! h: J! o
}
4 ?' N) H1 h2 u3 D& @
w# v" I, a' V; _ delete []b1;
+ {$ @8 c# C) ^7 b1 D. ^ delete []b2; 1 V2 E% Y, g$ [& r3 E
|
|