TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! x4 }: c: v _, i4 D% Z- l' n+ L& f5 G: ]- p
理了理思路,重新做了一个测试。
' \) Q: ^3 c4 r6 |* n8 U5 U8 W做了两个 vector 和 两个 float *, 都长 1000001 g* n/ x0 t3 U$ G. t% C
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 _& {9 K) V7 L, }2 O; }0 R* Z" \# W
/ P% r$ i/ @5 D2 L* _7 F/ U9 p内循环试了4种方法,
5 j# q. Y2 j8 S$ h5 O1. 直接调用 vector inner_product 247s % h# S! E" c: \, L. Y% d4 u1 L
2. vector 循环点乘累加 237s, O. u) }8 i# P
3. float * 循环点乘累加 204s
8 @' p5 h0 V7 m" O" @1 [* g! r4. 空循环 100000 次 202s1 x- D& y4 V. O" ^
* K$ K0 g" r( J% P
不做内循环 200s
1 w l5 C- m" A8 c6 _7 {# u+ I- b5 q+ p( q. F4 u9 n
你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 R \: v) h* D
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, T4 e% v' b. s: u3 [% R
" p5 H; i) b- U6 F" x1 u至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 v4 K1 A& l' j/ ?7 ?5 g; c
) |* {0 o: r, q ^3 i(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) ?; P" e$ ]" [+ j; B! X+ a3 U: h- `& J' ~6 X" u# S" p1 ]* j
std::vector < float > vec1(N);9 s3 o; B! N3 n0 V* t+ [/ U% [
std::vector < float > vec2(N);
; |* g( y/ f% q j6 _# O float* b1 = new float[N];6 G b6 u$ `) \, v9 M' }: L
float* b2 = new float[N];
8 Q/ |7 y+ d7 P. y$ d+ s8 u. P) c9 d
for (int j = 0; j < 6000; j++)4 S. U! c& f" z8 Z. \$ t
{3 O) s7 b+ v. P. f( N4 s2 }. O7 a
std::generate(vec1.begin(), vec1.end(), []() {
( l' z& }" [- c! J z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! \7 Y. ]# A" g, s+ N6 E' a
});* w$ R' @. C9 ~
8 s0 J! J' d& V$ n3 `( Y
std::generate(vec2.begin(), vec2.end(), []() {' {0 `! s- G0 ^( Z3 @1 ]! z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ Z3 T5 Q6 Y9 ^9 {9 g, U- f
});/ @; ]3 ? J8 L+ k5 q h& H V
( H4 t$ c- u# _1 G for (size_t jj = 0; jj < vec1.size(); jj++)' s) R9 T- V& p1 E# C9 F
{1 x3 Z/ v x1 B' t
b1[jj] = vec1[jj];: Y2 _% n6 A' Z6 `4 d1 R# J7 V
} n+ m# ^: I: g* E- e! T! \0 u* D' a2 Y
e+ A1 W% U; \: f* s for (size_t jj = 0; jj < vec2.size(); jj++)
1 J: |/ F. o( x0 Q6 ~2 | {7 Y' q8 r5 `+ y! Q: _
b2[jj] = vec2[jj];
9 i7 }+ {7 ]+ N3 u3 h }
: w* X3 P: b- T/ n/ L& [
/ b5 c& R5 [, p4 F; k8 T( ~4 Z //Method - 1 N=100000 247s
8 D' s6 T4 W) V9 s1 b+ A7 z //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 ~! h& T7 N1 g( B: @) i8 \8 H
+ f& ?; T7 q: {% l1 ]" _
//Method - 2 N=100000 237s
- Q: r! B) m0 ^/ S' p1 L /*! z# d1 k: Z5 X% \4 G: _
for (int jj = 0; jj < N ; jj++)
6 U6 U0 B% ]! A" J2 X {# a/ I6 U. v# T. U
fresult += vec1[jj] * vec2[jj];4 J8 d; Q5 ?1 q
}
1 I9 } f D/ O3 n' V */( W7 S% y! L6 t" ~0 f
?; x _" F3 b* r8 `, ~2 a //Method - 3 N=100000 204s Y# L7 f& e$ l4 z9 k
/*# K$ H J' B: K
for (int jj = 0; jj < N; jj++)
+ _/ w8 f* a4 V3 ^. ^ {
( `! A% f$ C. Y" s8 `* P" B: M! k fresult += b1[jj] * b2[jj];: R* j" @$ y1 Y2 O* R4 X2 f0 V
}% g" j8 }. L3 @. m8 J
*/
$ N- o$ D; _# H- z# c; h+ t; s+ x$ X7 C7 C7 I
//Method - 4 202s+ x! o' _$ L% g2 o3 v b) L
/*. k0 {& X i* J7 z: V
for (int jj = 0; jj < N; jj++)
+ q3 ]# @' H, l {
3 T0 X( {/ N' m2 x : H( j, }7 D J5 _9 u' c9 }
}& l, |) v& j; R' s. O
*/! j7 y* }: ^ |7 @3 l) ]
//comment out all methods, N=100000 202s
r$ p' j/ F% Z$ \; V }
0 d& F. |5 u, y
0 T' I! u$ D$ ~3 { delete []b1;
@) F( }* V( |/ i delete []b2;
) o; Z: j2 y. n: O |
|