TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* A. J4 L q6 O/ W. |. S4 h& [6 i) D% W2 Q9 K) i/ n
理了理思路,重新做了一个测试。
! Q! B3 x. f% ~ S4 d2 y5 R做了两个 vector 和 两个 float *, 都长 100000
/ a( K6 p3 T& j. Y! T: g外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( e: a6 o( i2 t5 x
9 [0 D) m! m) N% c& m
内循环试了4种方法,/ _8 R' f R" X& a
1. 直接调用 vector inner_product 247s 2 C6 P! G, C7 u+ T o( O7 x
2. vector 循环点乘累加 237s
6 Q' n+ V: I6 T* B/ z4 e" T+ O3. float * 循环点乘累加 204s
. x; h' B' E ~" Y6 [! c2 I4. 空循环 100000 次 202s6 P: @* n" M. X5 |
+ g& F, m5 h# A, [2 Y* W不做内循环 200s. E! s5 l2 b) B! T1 m3 o; n% \0 @
4 o, R' }3 M8 c/ l! N3 M' r
你昨天说的对,内循环本身占比是很小的,大头在其他处理。' j5 E' ?, x; a% G
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. ]( {- L. D- _8 a( d
& j' u( O& ^" {# z+ F! r
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): H$ R- \ f" E: q4 d
# L& q8 T/ W- U* J# s8 B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
2 J( w$ w7 r) f$ ^5 q7 r; ~" y# _ k1 F) a) p5 {
std::vector < float > vec1(N);
& }# b' C3 g* P- `* ] std::vector < float > vec2(N);4 ^ n1 d- k# A$ i& `7 T8 I2 g6 |
float* b1 = new float[N];
4 D8 ] ^+ ~: b; p1 c float* b2 = new float[N];
4 F0 z2 i! ?$ Y( I9 p: p: T! s! X& d9 w( c+ ~7 x5 C
for (int j = 0; j < 6000; j++)6 Z0 b6 l6 ?1 u* E
{
' z" I: z$ V+ b+ D4 t1 t std::generate(vec1.begin(), vec1.end(), []() {# u. c- v* S% B$ T
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ v0 @ L9 r- ~0 H" m( |+ _ });
. N+ C: c* h7 T4 T! R
$ R( h" ~) G# _# y( v' k std::generate(vec2.begin(), vec2.end(), []() {3 C% J" C# ~( c
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, x. O- M/ s/ w9 A+ X7 j });4 {6 B1 l0 g0 r; d8 f% G
$ ?' a$ @$ d5 I6 c T s
for (size_t jj = 0; jj < vec1.size(); jj++)9 j" @0 A- _. g u
{
1 L6 ~% t7 ] j; t- m3 \0 M4 q' k1 F b1[jj] = vec1[jj];
0 f0 z ]# }: e" m0 Z1 _+ i }
! R8 g- y* f* k- E& h
2 v2 v# u, c- X for (size_t jj = 0; jj < vec2.size(); jj++), N6 Q" K9 v0 k& S
{
# B$ @; z2 K# j' D: x+ a2 V b2[jj] = vec2[jj];8 e' {1 n4 `6 B6 \
}
7 R. a4 m( b+ g2 {/ Y
+ k2 v& `) m) j. q7 | //Method - 1 N=100000 247s
+ I! I( F' G& s3 j8 A, C //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 ?: O% L! `0 T " s! ]0 W' q% W+ P! P& o# c& v
//Method - 2 N=100000 237s
' T9 _+ E; T9 W" U# {" Q6 u5 U% u. z /*
! n, Z0 l3 h4 e6 q; P5 h4 d( v- _- ? for (int jj = 0; jj < N ; jj++)
3 p$ }% `1 e) L% v4 w# O! K {
- W7 m) P- l7 I fresult += vec1[jj] * vec2[jj];' s* U; Q1 Y/ n
}
/ H6 h0 }7 @7 J. u" V */
& b" m, s2 ]% z2 ^ + f! H) M: l% R+ K+ p1 h
//Method - 3 N=100000 204s; M+ p. @8 K2 o# F( L0 ]
/*
1 M5 M% S8 A1 B- n" Q' W" G* N for (int jj = 0; jj < N; jj++)" u) L! O2 e: R7 }, J
{
4 Y* g+ x3 J' y6 Y" d, D3 X fresult += b1[jj] * b2[jj];" `# ^" T7 e) m6 I# `, u# |
}
& T$ y, v$ w) r: c' C */
) b! F0 t8 K; L4 h( K* {( {; h! K( D) j/ N/ B
//Method - 4 202s
. M8 s+ x- {+ G9 v* ` /* Q8 f1 A7 B( e C4 F6 H
for (int jj = 0; jj < N; jj++)/ n \ _# t b- ^
{) [, S0 l& G2 a& l( u+ M$ }
, g! S# X* r) X/ h% u: n, ~
}
$ g0 ]1 b9 \+ h% I0 W( _1 z */
3 F5 f# ?- h: {! o" A8 Z //comment out all methods, N=100000 202s
; G+ A9 E9 R2 u1 W }
+ [- V- C+ ]& G5 f c1 F
( `' B; o7 d K6 I, a% C% ]0 N! ^9 A delete []b1;# \! Y* a+ p; R+ z- ^" m
delete []b2; / w' q* l# z/ M6 |1 |+ ^; l
|
|