TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 H8 h" ~4 h$ q' z( @. S
& I. b8 N7 N) v4 E! B# s理了理思路,重新做了一个测试。) W/ T8 P. K& e
做了两个 vector 和 两个 float *, 都长 100000
/ K7 w( M ~+ s0 ]% q/ [外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ _0 j$ _9 H/ U) _% N9 [# {
9 V- n, ^: Z$ Y @7 }, c
内循环试了4种方法,
; u% t# S+ H! n3 o, w; [) e X1. 直接调用 vector inner_product 247s
/ C8 P0 M6 v! w$ w2. vector 循环点乘累加 237s |) S$ E2 c- G0 B! T% q0 @
3. float * 循环点乘累加 204s1 n: \5 G J+ A% u
4. 空循环 100000 次 202s/ R* o+ {, L" ?. u$ `7 Q6 S5 c
8 J$ \9 M/ v" d# u) Z+ V不做内循环 200s
- ~1 W% g; i9 K; J/ G% d
4 {3 h8 ]5 b; j6 s( {' Z: }你昨天说的对,内循环本身占比是很小的,大头在其他处理。; [+ {" z" o# n7 z" j9 l1 i
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 H/ `0 T4 P7 I) t; X: f. C% _0 X
# t! d& b& |# ]( W/ A至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 [/ [0 n4 d$ e: t) k0 l- S- w
" F5 u2 A: _. R+ j. M% I' X(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
Z. J$ ^' b/ V% H: E& ^' H8 j" S9 A# F4 I
std::vector < float > vec1(N);6 u$ c$ P3 l/ N H
std::vector < float > vec2(N);
4 R( @8 D z# N4 H' }3 [* W% u float* b1 = new float[N];& n; {2 Y1 K, A2 C1 {) G
float* b2 = new float[N];' X! V7 |( n1 a* R& B# O
- d/ Q# x9 c$ R! @1 |
for (int j = 0; j < 6000; j++)
7 y6 D: R% k1 T2 P4 M {9 e& [: l% _: S& q1 W
std::generate(vec1.begin(), vec1.end(), []() {
5 v4 W( f' g7 I' H* v/ b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
9 H$ V* T4 s- M });1 F+ |5 J1 q+ Q6 ^* q
8 s I! W6 ` |
std::generate(vec2.begin(), vec2.end(), []() {/ X$ v7 `5 f1 \! q3 A' G5 c
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: D$ S+ @3 H3 J5 [9 X
});
4 H, r5 ^9 L+ ^5 d1 P1 F$ ]7 }# d0 o3 H# f4 |) r
for (size_t jj = 0; jj < vec1.size(); jj++)
0 k' K) _5 {& P0 ~ {$ K- ~# }! l! Y% |; t2 o
b1[jj] = vec1[jj];
( U$ r; H$ a& w0 D5 W6 u }; N5 N1 d7 a7 q3 j% a F$ a
6 J, `# f, M+ L) J# {0 |$ L0 J) G" i for (size_t jj = 0; jj < vec2.size(); jj++)( n! F5 ~( S% ^, r9 u* f
{; p- I' @; R1 m# Q6 `/ K2 _
b2[jj] = vec2[jj];8 L+ g. B2 n6 l9 p) L. a
}, @1 Z+ ~) y i: P: v# m8 v
- u7 P1 o" d/ ~2 {" C2 ~ //Method - 1 N=100000 247s
4 G# G- j! q& F: \/ ` t* i( ^/ C: U //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 {( D; p& z2 i! }
5 C' V; v1 F, _
//Method - 2 N=100000 237s
: E: V* @, \0 }6 c8 B- F! G6 N /*6 A3 S* g. t7 K, ^, t" l
for (int jj = 0; jj < N ; jj++)( y% f% ~ m! y/ W |0 J f
{
; z4 n" C8 {. g' N$ y& ^ fresult += vec1[jj] * vec2[jj];
/ A9 Q l( t' d. P8 s }6 g; z9 ?& Y o. X% c4 z$ I
*/
6 ?6 N. a6 G" s; A! D
; [, h% H' ^/ |0 }1 l+ `& i4 j //Method - 3 N=100000 204s- u. Z$ N; b7 z
/*1 g! X& G1 }. {8 n4 q
for (int jj = 0; jj < N; jj++)
# R( e3 _+ W$ H {( |) i b/ B* I l3 V$ T" R
fresult += b1[jj] * b2[jj];
' J! F! T7 Q# D* v8 N2 @7 E }& B L& H% |5 b: [. z9 |4 r' S
*/" t/ ~4 c5 r `% ]: n1 e
7 y a# Q, F; \0 a% p
//Method - 4 202s" q$ B$ Z/ g2 b; e- z
/*% h" ~/ z9 q1 @ Q; Z2 {
for (int jj = 0; jj < N; jj++)1 o( f$ c ?& I0 c4 a2 J; Q
{
$ `' w' H- v9 r
9 i9 o5 v0 n z) z }; O4 Q F- ^% Y
*/
$ K5 j1 }6 p- |. m$ S E //comment out all methods, N=100000 202s 5 y8 l+ j. P# D+ z( q
}4 I( T3 S: I @* n9 `
+ j- Z6 s5 O+ S5 E
delete []b1;
k) E0 \) ?- s. S0 l1 m delete []b2; # ?( o8 I9 Y/ _! a; N& m1 a. n2 b
|
|