TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( M4 H; B; A' j+ N7 G' z1 l, A
& g+ _6 }4 g8 [+ C" T理了理思路,重新做了一个测试。# ?- q% N3 O6 M+ ]
做了两个 vector 和 两个 float *, 都长 100000
+ y7 H" A: b O- {! Q4 Z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& q Z3 k9 W' F) p
( ?2 T( p3 o# V& H# |内循环试了4种方法,0 }) t- }3 i6 B8 F- {( h/ K, S& m
1. 直接调用 vector inner_product 247s
0 `) j8 [% u" Y. U+ W" Q3 {2. vector 循环点乘累加 237s9 I/ o1 a5 f w* B
3. float * 循环点乘累加 204s0 q* Y W; R& m! D3 o, d
4. 空循环 100000 次 202s
9 q; o. y. ?( s9 \
- T+ k4 {: m; K" t! D不做内循环 200s
' Q- V3 Y& Y( @- F" c1 W) o( I' L0 R6 D. a
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
" e. L, s" ^" a: T7 h6 H2 h/ V另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
/ w- H) k" L1 l; ?9 ?3 X' N6 p
) Z8 }6 k6 i, d. t# d至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
& Z& s" q' b+ y) x# h: k& h* f. I+ Q. w4 n l ?7 m
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
$ _' k$ C) h( ^" E: K* K
8 l: Z' S0 G! Q7 F3 z std::vector < float > vec1(N);; i- p. R( a# \9 d1 ]) j
std::vector < float > vec2(N);
' z8 ?+ B y& o" d8 [4 a8 o float* b1 = new float[N];
. C- i( V! m- u3 z( B: @& L float* b2 = new float[N];' e0 A# q! ~* i9 @! `' c5 @4 T
% G7 K4 P- f$ N, Z for (int j = 0; j < 6000; j++)- J7 \. p: b/ T. J9 c
{
; j3 ~5 U! P0 i% u. ~* f v2 ] std::generate(vec1.begin(), vec1.end(), []() {+ U# }* }5 @4 S* e
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% p1 T( O" V3 C0 Z% B
});9 G& f. X* U* i7 v
& E3 S+ R4 a! p std::generate(vec2.begin(), vec2.end(), []() {
. {1 k H( T5 p& T& T/ C return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: q7 |' Z1 _" j5 Z/ R1 m
});
! H, O2 `. I' s, P
; H2 K! o8 ?1 p7 j. V! L( U$ Q for (size_t jj = 0; jj < vec1.size(); jj++)( R0 G+ U! |/ d& R) j- m
{1 K5 m# h4 z. S$ t+ j6 y
b1[jj] = vec1[jj];
3 \4 E0 C v' s2 _ }
$ A) o- d! c+ h# q* \ d
$ @6 c6 T, v$ o8 {! C/ N* V for (size_t jj = 0; jj < vec2.size(); jj++)- `" o6 g2 i1 D; ^4 z
{# ^4 ^7 x* J& x* _
b2[jj] = vec2[jj];
; X3 \' H& z$ f) g5 a: ^ }' r9 O& o" s; Z: J: _* t
2 Y' w) ~% i, V, l5 s" N% G
//Method - 1 N=100000 247s 8 _- j% X( U. Z9 X- f2 H
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 y% k$ G, J j: a3 o3 Q P
1 }$ S9 Y+ X- X- f) ~8 u //Method - 2 N=100000 237s
# X# x; {4 y, }1 J E /*# m- c' O) L3 m1 Q' {6 K$ F
for (int jj = 0; jj < N ; jj++)( j0 ?3 A/ D* ^0 }' _) H+ `/ q. T
{
0 Q- O; m6 {( z- O fresult += vec1[jj] * vec2[jj];+ }% f b5 O1 k0 P
}
. C/ [9 a) _' T$ q* p( y: z" i */
# Y6 R7 G. f2 p# b. G1 H5 m) Y7 W7 k & S- P* h4 I9 ]: R) L
//Method - 3 N=100000 204s
/ J4 [% ?0 e$ h! ~1 b6 m9 J /*
3 I1 w7 J) B: W; } for (int jj = 0; jj < N; jj++), ?( ]& t* ^& `7 D2 B) l
{
" e7 ?7 p" H( W9 g+ V- o8 a% l, \ fresult += b1[jj] * b2[jj];
/ L4 s# A, o) B0 p9 ~5 ~0 E8 t }
/ K" I% h" p" n% ? */
/ h* f6 s' s% v& d- ~# c( J
$ L( i7 o- g9 Z8 F3 L1 N //Method - 4 202s
0 x: }3 G0 L: O' p4 j /*. @. |8 v% Q1 k9 d0 R& b6 R
for (int jj = 0; jj < N; jj++)
& A7 b$ s& C7 \6 A {4 P- N* S& Q* ~* S
r) V; A6 Q! [+ | O
}6 c% \% o% z2 I+ S% ?9 x
*/
7 w, B/ {! {/ Y' \5 V //comment out all methods, N=100000 202s
3 {9 n8 }: i9 X9 z' e+ F' r }
( G# b3 m$ W& b) S6 `3 K) X# \: o! C/ D* V) h) H
delete []b1;
- D% p& }5 j+ P& N( F# k5 U delete []b2;
7 R5 k. ? ^* r0 c U: e |
|