TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
5 D6 Y% R$ t- G+ ^4 ~
7 W2 c" F5 e6 T& G9 P理了理思路,重新做了一个测试。9 T9 K2 s! c% j" z
做了两个 vector 和 两个 float *, 都长 100000
: C# u) g# a, s2 U4 b外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. d" q4 k& o0 X# o
) k6 J! w+ } E4 ~& `
内循环试了4种方法,
" f# y" |, \. }5 z- b- O- ?1. 直接调用 vector inner_product 247s 5 W4 r( |) G) G# r. S
2. vector 循环点乘累加 237s
7 E! q3 g+ z/ v1 w3. float * 循环点乘累加 204s
! y8 |. e8 B# X# ~: x) ~) G( V2 ~4. 空循环 100000 次 202s8 c& u0 k% Y6 o, K% f
/ F0 e+ i8 m) T0 n1 d不做内循环 200s, L* }# C5 b( Q( X8 e# K. D8 g
1 j7 Q0 t2 U3 @: }2 o你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 {4 A$ a' Q9 D/ l* U
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 f0 E+ E! C0 w: w" I+ }4 y" P4 {* U, n, _9 A
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
) \) F- v8 j+ B* Z) ?' A
/ s0 V, ?! n6 M |. i& c(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ C! r1 J! L6 R1 Z7 o2 X
. k" d# o- ^. ^, N+ g3 W
std::vector < float > vec1(N);6 A! E4 |' j- M" N, Q' ?7 q3 y
std::vector < float > vec2(N);" w4 j! v/ Q8 P9 h; `5 r# ?: u1 O
float* b1 = new float[N];
" U% W3 M- z" a5 L! p% c9 M% _ float* b2 = new float[N];3 A. V9 }" G4 J& K3 w
) b* e. `5 X5 }5 \3 I E: a$ G& z for (int j = 0; j < 6000; j++)
! r$ p3 M- K! o: G, e" d {4 e) X# { O% J- t# m
std::generate(vec1.begin(), vec1.end(), []() {" x3 K! e" K3 N/ |1 P, {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;7 }2 j6 y: e' C
});
" \+ w& b7 _4 l# n
3 {. ]/ }. S% Q( ^* Y4 o6 Q1 P/ I std::generate(vec2.begin(), vec2.end(), []() {, z7 g; I% s. [$ c7 I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& Z+ W6 E7 _0 {7 G5 O& j });8 e/ L. v6 O& S. A( N
& }" B3 N+ b. }( u
for (size_t jj = 0; jj < vec1.size(); jj++)5 E) {4 X( b2 \6 v# w
{# e! b8 ~0 D( [( @: T7 [( A$ w
b1[jj] = vec1[jj];& x. q& \: m! ]4 k/ `/ i* T
}& g4 w: g" W7 C6 j$ B8 A7 | |
! m8 F+ ~# R$ R1 W5 u _+ V
for (size_t jj = 0; jj < vec2.size(); jj++); X' R! M9 g$ {! \ N @
{
# w! t* E/ F7 N" W b2[jj] = vec2[jj];# v. H2 r" a+ I7 y+ q
}; w1 t+ f% E0 f5 n8 o% J' M
7 C" G+ n. u; a+ e //Method - 1 N=100000 247s
$ F" O* M$ N8 d9 k p; L8 S. f //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ q9 i# a" S6 i6 x1 H
/ ]% u6 s) C8 o5 D. N9 s //Method - 2 N=100000 237s
6 a p6 C( v! ]8 S /*6 _1 ^4 Q1 F, |! E: i
for (int jj = 0; jj < N ; jj++)
* d+ e" |& h* V: V9 Z4 z( ] {
+ |# B; r% `/ M) j) C: J3 [ fresult += vec1[jj] * vec2[jj];& l; ?8 w I- C& @" `/ ~
}
& `: r' a7 V( L% E( h! V7 D B */* d$ i0 u& p0 ?) O! z
9 W8 b7 Z' Q# k# S. g
//Method - 3 N=100000 204s+ ?+ A& z7 b; T( J. ]- Z
/*3 ^- [: D& c: t: {% s
for (int jj = 0; jj < N; jj++)
! P w( C! s6 H) Z* `: [7 c {0 d t6 n5 D2 y4 J/ S' ?( M9 z4 ~
fresult += b1[jj] * b2[jj];2 r' i+ f+ `* \& L
}
' u) M( _/ @* ?3 r, @. Z( N */
9 w% v! g" p5 H1 U2 y( J& n" i" L2 d) t4 H6 F* C8 i2 [$ E) V
//Method - 4 202s
; T8 e# m1 }# n4 [% i0 ~9 J. V /*
' f1 U+ ]) r% c for (int jj = 0; jj < N; jj++)7 A8 K. R4 ?( |# @
{( }& X. K+ T" g) o! D$ r
1 S1 G' E) Y& [+ Y% S6 R# m Z2 p
}: M8 |6 U' D1 f8 k
*/
' l% e4 E, s1 t! I //comment out all methods, N=100000 202s
% X$ z3 D; D5 P, K }
' Y. \- ]' k& R4 d$ p
3 y$ `' ^: ?. [- t& X1 ~ delete []b1;; Z7 l$ f% ^4 w* H) @- S% F' c
delete []b2;
/ z: x6 k; _$ z( A |
|