TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' _; \- K" c0 m
! e! c2 N8 @' c( _2 Q理了理思路,重新做了一个测试。
7 f1 Q3 } R8 m" g/ J5 l5 H1 C9 ^1 L/ Q做了两个 vector 和 两个 float *, 都长 100000' l5 f" w7 t- ?; w5 b+ p
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' X- n1 C2 C) i0 T; W" n( H, I, X
, t' h; w+ \! d% C5 C4 ~内循环试了4种方法,3 }, ?9 Z7 j. m8 R- g
1. 直接调用 vector inner_product 247s . X# b, A) V8 O* C! F; i* w
2. vector 循环点乘累加 237s5 a) |; r2 B( B- S# L1 S& \* V
3. float * 循环点乘累加 204s X( _% e9 _( K& w" G
4. 空循环 100000 次 202s
& v2 n( A" P5 Q6 ~
}0 ?$ ?: C/ M$ j" _9 s" T8 K" K不做内循环 200s
7 G. V2 O1 H/ O- u# @: a+ \, z4 a5 a8 N) ?' g% C0 D, J
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
* f+ J+ L+ q/ G4 |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
/ W3 k3 h ^3 x# \: F6 N6 H; V |8 F) I( {% _: I+ ]
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
' s0 l! C2 ~5 S! |- W- `% M) O& c% ^! O" Y% H! `3 }/ {. L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 W) J& b `+ C
6 M% B, u: K/ T
std::vector < float > vec1(N);8 c# E% F- m2 N C$ _
std::vector < float > vec2(N);; c5 z& e2 ]) ]+ e; s$ ~1 Y
float* b1 = new float[N];
% C1 M2 y* t9 t/ U4 g* h float* b2 = new float[N];
) n# P1 O* q: X3 m
2 F2 g* {7 x; V6 l for (int j = 0; j < 6000; j++)" `; b7 k2 I6 v& r; ~
{4 ~* R4 v9 ?3 G' T8 z' j) \ Q+ I
std::generate(vec1.begin(), vec1.end(), []() {. |% T0 [" ~& @* p& R- \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
* M+ _- ^" V( O$ Q6 H% p });+ c5 p+ b2 ^2 N( n e) v
( G8 K- j8 q' P! W0 {
std::generate(vec2.begin(), vec2.end(), []() {. F8 R+ R6 Q6 F# k6 z j, ?8 S
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 Q* j1 T1 h0 p0 X. |
});! U4 M- k! u0 f5 W$ r& m- n
* _0 c8 B/ b* N( i8 H
for (size_t jj = 0; jj < vec1.size(); jj++)
: q( o8 K0 j+ \9 |# x- ?* u8 e% M {
5 ^9 x* j0 R( {3 V b1[jj] = vec1[jj];
( K4 t+ ^' C1 c" V6 F: j) ]1 G }9 o2 w' O! J h
8 T/ H7 [! v! e9 O: G0 C! I
for (size_t jj = 0; jj < vec2.size(); jj++)8 b8 K" T4 q2 T+ x. j
{! ]! c, m3 P) U$ {/ k3 b' T# ^) G
b2[jj] = vec2[jj];6 S5 Q. U* R& Y9 ?- Z& Y( {* `% B
}
! D* I5 w; l T6 Z; J: i+ T" z* s' y
//Method - 1 N=100000 247s
& K2 f4 |1 K, P9 W. V7 X6 m5 \' j //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- c# I' `+ L3 P& o
4 q4 h; `8 U, J+ ^# c% b //Method - 2 N=100000 237s
' N2 t2 W+ B4 F3 O' L8 ] /*
5 `) G. C; f. M5 _2 V for (int jj = 0; jj < N ; jj++)
% C6 \0 Y+ C2 v {
6 A0 d) s2 d5 \' q% l2 } fresult += vec1[jj] * vec2[jj];; J# h: M4 I- q: Z) v& P1 x' d
}! _3 W: I+ u8 o( G" @/ q
*/
" W4 Y' g& c) }, N" T0 C' _ % n2 f- P1 |" X2 Z. v$ E% K
//Method - 3 N=100000 204s9 u+ l$ @' z+ x
/*( W$ i j3 N& Z1 D# W3 v( R, l
for (int jj = 0; jj < N; jj++)$ ?/ ?1 b1 v0 w$ Y) C
{ w* C; e; K% N1 F- O
fresult += b1[jj] * b2[jj];
6 e3 v( E( G% q5 ?6 a/ Z% {+ L }
. @3 V; O9 l; r8 |+ d6 ]. a */
+ j7 h( \+ l6 g) o: b7 S/ J4 [; z' O2 M3 I
//Method - 4 202s" E" V( w; k% O, Q
/*5 |8 G/ g) e" K {' M) @
for (int jj = 0; jj < N; jj++)
3 x' }& R S: `% G4 G {
( \% W# @6 [0 h4 Q x
/ n1 Q5 K. D1 X: ]8 `- Q }: `0 v& [& _8 J" g O
*/
9 ^% j9 B# N# I5 b8 q- S; | //comment out all methods, N=100000 202s
4 z [9 q) {6 S. b }( I! Z& }, x) p) p$ r
+ U7 y0 c0 \9 I; p
delete []b1;
5 `' h9 p8 _! o! {7 S1 z. c delete []b2; 1 W9 j$ l9 v. p7 A, |& @
|
|