TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 % ~8 g1 [. P8 M1 m$ P. @
# o/ v& h- s9 U理了理思路,重新做了一个测试。# x) [& v M' u* \- ~, K: |
做了两个 vector 和 两个 float *, 都长 100000
9 Q' r: l, R2 t3 c6 K外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
; f4 P5 @- y2 R/ T: Z: Y1 \" u3 |- \6 _" n' `
内循环试了4种方法,5 u5 Z5 l1 O' E$ ^5 s' L
1. 直接调用 vector inner_product 247s * g9 d& a$ F* K6 g
2. vector 循环点乘累加 237s
9 G9 e+ \3 i$ {2 C/ ^( F! T2 m i) v9 W3. float * 循环点乘累加 204s1 H% l6 z5 E3 `6 V
4. 空循环 100000 次 202s
E% w/ C$ B! c) b2 f+ o
* g+ v$ J: n$ ?1 K3 o0 |7 X不做内循环 200s0 ^7 H/ i( l' w% W5 Q
& m/ ]1 Y$ P( Y% m. p你昨天说的对,内循环本身占比是很小的,大头在其他处理。1 x1 d8 E9 O2 d8 v" |; z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. H" k N q, X2 v* G
$ v8 \8 r( P ^4 [/ y$ i
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! f" M' r" i3 ^) `% h6 W" @+ f% G% ^7 p: }2 K; L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 |- T+ G, w& l; i6 u/ U0 B! o/ F8 O4 m* K; {
std::vector < float > vec1(N);
1 R# |3 f. v- p std::vector < float > vec2(N);
& {* R' \; p" ~; e' v float* b1 = new float[N]; `- _, m8 C3 {
float* b2 = new float[N];5 y* A* p' Y: @
+ H, A( `. s- k# X6 G
for (int j = 0; j < 6000; j++)
1 w# Z0 t' q9 b6 b. A$ m& O { W5 _- X( u: M7 {8 E7 X
std::generate(vec1.begin(), vec1.end(), []() {
$ @- o* C) m) P, d+ P return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
5 V+ u, ~; ~: U# n: F4 D- k: N1 H });/ U, A$ Y9 O. m# ?
: x6 }) l* K% U" g std::generate(vec2.begin(), vec2.end(), []() { p! l4 ]1 I9 F+ P7 C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ A* s. u' ?" J6 Z: Z$ d# ~
});
; {8 g) U5 g+ p+ Q r. {& ?
3 ]3 L5 X+ ]/ e& N7 c" ?' ^: e& F for (size_t jj = 0; jj < vec1.size(); jj++)
" {! q( j4 H) S$ p6 n {6 w+ Z' E* Z) N- U# \( |, \
b1[jj] = vec1[jj];4 h8 J( G" O; v. o
}
' u- C9 I+ y) \8 o/ _' u& U* G/ N
6 R$ D" v0 ^( q$ z for (size_t jj = 0; jj < vec2.size(); jj++), b9 B `! K: v! {
{
) E) ]2 T4 U* o b2[jj] = vec2[jj];
6 H5 A) [0 G: J9 J* F9 w d. [: I) @ }
7 [8 @5 X/ s2 {1 @9 W
- `/ E2 R% @4 v% C //Method - 1 N=100000 247s ) g: n8 X- U0 H+ Z: w4 x7 A
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ T6 {: Y" h: {7 A, G y ! `! p* h0 s5 k m# n9 P6 F
//Method - 2 N=100000 237s
K# G" B' u# _$ {% a /*5 N. Y4 M% Z, b3 T' ]& l
for (int jj = 0; jj < N ; jj++)9 n! c% v( H g& k/ C. u, W
{
8 y9 a* {& K+ n9 v* z; X fresult += vec1[jj] * vec2[jj];
: |% ~5 A* U: i% S R, B; C* J9 z }
* S, e4 ~) H$ R. R3 \ */
! {) R2 C' M$ _, \& Z
& _. A) i- ~3 M, j7 E3 Z- Y7 [/ A //Method - 3 N=100000 204s
( B4 U9 {8 |7 j2 n q /*# y f" {6 o5 H! L, M/ T
for (int jj = 0; jj < N; jj++)
* e$ Y# L: D" @# ~+ W0 ] {
; ?8 {; x$ E3 J3 \ fresult += b1[jj] * b2[jj];" d: ]7 g+ C, k2 o6 V
}
5 ^$ t3 t: h2 r& [ */
" I/ Q5 D) m" v. b
) r- v0 l6 y# u2 D" _ F; c, z' _ //Method - 4 202s( Q" y+ j* j9 H8 Y4 U2 L3 {' k$ K
/*) f' ]$ d& a% |1 Z, J+ U
for (int jj = 0; jj < N; jj++)% t; T4 j8 |9 ?* b, i2 ^. [, k8 i
{" X% ? c }9 C- [
) F- T F: Y7 }* o I h7 f/ n }' i! f! i; M5 B0 ]+ h+ {! M2 c+ P
*/9 A8 | a( X, [5 _
//comment out all methods, N=100000 202s , j+ {" p1 s. k8 _
}0 @# _5 c! Q% s* H
0 c3 ]# h0 J* I6 ?+ {, C% E' s delete []b1;
0 O- _: n* O( R% i+ x delete []b2;
6 c$ C6 v `/ v, ~ |
|