TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
: v1 J& m) t1 V% _* ^3 U
: F- g+ z# u' { Y+ n2 ?) H理了理思路,重新做了一个测试。$ |: O$ F$ n. c6 X2 ^
做了两个 vector 和 两个 float *, 都长 100000) g7 A% \" W9 g: K$ x
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 @0 ~6 j. G9 e* j. `. y* p. ]5 S- F+ ?1 _1 E0 f
内循环试了4种方法,& g* K5 ]3 F8 n
1. 直接调用 vector inner_product 247s
- F8 N8 F/ C- M* Z/ c2. vector 循环点乘累加 237s
2 R+ `5 E, C; A' O5 h3. float * 循环点乘累加 204s$ f; d2 c/ V2 J* J% L: l
4. 空循环 100000 次 202s
0 ~% d: z' t: r/ T- j" x6 Z4 c5 B5 R! S& Z
不做内循环 200s
. n9 L7 R$ ?6 A$ N! K! D: s9 E1 r$ n) k j9 L o) h
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, R" l/ o) r- t3 y J0 p
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, O8 q4 u& d, N) g; E
3 r! a8 a3 R K& [% G) m
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)7 r5 Q# w5 d' W0 g0 \
* K" G/ l& V: a1 _
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ `% X# k3 }0 g; {1 A, v
{% R* Z# L/ o0 C/ ~& l3 u std::vector < float > vec1(N); b* f) }1 j8 y
std::vector < float > vec2(N);, G9 C E2 F& Q, ], C! o( v1 ~* v/ V
float* b1 = new float[N];
) m9 c' t- ]9 h4 H2 r- y float* b2 = new float[N];1 f: ?/ h& d+ Y$ U/ i
5 ]% j. K8 u( A& |1 ]
for (int j = 0; j < 6000; j++)
2 E6 f4 j" p: ~$ r {7 _; p' y; Y) [- p9 N1 O1 \0 M
std::generate(vec1.begin(), vec1.end(), []() {2 s! t4 i! a+ T( j
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" e5 O% t6 h) J- a1 t });
$ b1 a& m$ t1 K: d4 I/ J
* A7 v" ?4 n& L' o$ C; n std::generate(vec2.begin(), vec2.end(), []() {- _9 j* r" ~5 G$ v$ j( u- J0 R
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& l* ^& B4 y3 ]+ b1 U! \
});% K+ R% J5 j+ M% I) D, p+ l
9 o1 q5 D$ f7 ^3 j% j for (size_t jj = 0; jj < vec1.size(); jj++)$ X# x2 t4 |; n1 W' t9 o$ A4 w
{
! c) F" U( U. u8 |7 U+ Z b1[jj] = vec1[jj];$ t5 l3 c( m. \1 x8 M2 l
}" y9 F( m4 o2 g! n5 Q
' r9 R$ h, d- s5 L: o" [* [ for (size_t jj = 0; jj < vec2.size(); jj++)
& Y$ [5 s3 X8 g- @% u- C4 k" o {. W- l4 @' K7 g& H2 N% k
b2[jj] = vec2[jj];7 L/ N1 e" S8 D; h! j$ Z3 v
}
+ w& x3 q8 Y2 X8 a! o4 q h9 D* h2 V& |- o) E
//Method - 1 N=100000 247s + ?% Y y/ Q5 W- y6 M' L6 M
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ Z" C9 g: i3 ^" h7 G) U
+ E4 R' x. @" B7 s. s1 h //Method - 2 N=100000 237s! \9 A8 t: w1 t, d' {) O# t! c
/*# Y9 b! K }2 X7 e5 L
for (int jj = 0; jj < N ; jj++)
# P, I. R9 I# i5 b# o2 u% S% W1 J {- D2 J' J {* C8 B# k2 E
fresult += vec1[jj] * vec2[jj];
; _+ I [. M, n }) E" p% v7 p) C' U
*/% O8 q. l+ B: K9 [+ @. K" x: N
3 O0 i6 ?2 s0 X
//Method - 3 N=100000 204s
0 ?- ? R. |7 ^$ o& l5 a /*! F/ \ i2 I3 x4 c* L8 k+ G9 g' w
for (int jj = 0; jj < N; jj++)
6 @+ R2 U6 T$ m8 F. h' J* [ @' j {( c1 y0 b: k8 _9 Q: P. o
fresult += b1[jj] * b2[jj];
# z5 a, u. z, F4 T9 O& [# w9 d }$ E6 B7 r' J( q" {
*/
+ e! i2 g/ ^* m0 } Y) u1 ~0 F1 r F$ v
//Method - 4 202s
" X% g1 T9 p/ u9 b- ~+ N /*. `( R) E0 o$ g# f( q/ @: b, Y" d
for (int jj = 0; jj < N; jj++)
3 n8 h9 e* a5 J1 w- v. G- X0 P {
* z7 B% R1 z4 Z2 E( P9 x$ A 9 d1 s5 F; M& o% l! G, q$ z# z
}3 _/ e+ Z) \( }6 G
*/" q9 b' c9 [8 y( t5 Y
//comment out all methods, N=100000 202s
7 F0 _$ v) J' C& G }
# X) {* V5 V8 u$ Y( V; A, Z: `# A! O# ~7 ^
delete []b1;
5 ~) O' C5 O* _. O3 |5 u delete []b2; ' P$ R8 R6 [+ Z8 \! I7 J
|
|