TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 l4 x" ?7 n9 a1 Y' x, I- m; f
2 N* u/ Q) S; Q3 ^/ k/ y% J
理了理思路,重新做了一个测试。1 K x# u& Q$ Q$ N) L: ~6 v
做了两个 vector 和 两个 float *, 都长 100000
6 T+ J: h) ]. A Z. h- o外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
9 P3 o0 v" f' r/ v! l! m% P6 B, v) i% D
内循环试了4种方法,
: O% E# J4 W7 R5 `; _1 b3 e b6 h& V# i1. 直接调用 vector inner_product 247s
$ w e! [; ?( n2. vector 循环点乘累加 237s* P2 v' T$ H0 B' ]* }: Y; N( B
3. float * 循环点乘累加 204s Q/ R- Q! s N, r0 c+ D4 {
4. 空循环 100000 次 202s5 G' [# H* ^( y* O6 l7 C D3 N
/ d0 _; F; p1 g4 u不做内循环 200s
% H4 {7 E/ S" c# r, d. W9 q# I+ I& y9 r# D* W# J
你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 d+ @. \2 ]2 y4 `
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 F, W" \6 d+ M. g
4 N% n$ b2 f5 |2 [- \- d0 Z' M至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) s2 A1 J# E' l7 O8 {8 r5 w
6 q& C/ R8 x& r& X1 d+ @5 K
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
$ w2 S; S3 Z5 z1 w; k
, Y6 v+ c: E8 ] h% @ std::vector < float > vec1(N);! y( x( X2 ~$ U1 t6 h" B1 O5 S
std::vector < float > vec2(N);
- |# \7 q, E3 s float* b1 = new float[N];
3 }3 F4 {, f5 A1 T float* b2 = new float[N];
1 x- t" F! C$ X$ g
6 K6 S3 h/ [( E Z9 O6 }0 | for (int j = 0; j < 6000; j++)
" l$ K" M5 E/ w6 }, A {
6 v) |% F$ I% G# n' x" T; s std::generate(vec1.begin(), vec1.end(), []() {! }* U3 |/ u% A, e) M6 O
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
! {% D/ {- w c- _3 ]' k });% @5 ^2 J- b3 r1 D3 w
1 w' r$ G. M" y% T% E, O2 _ std::generate(vec2.begin(), vec2.end(), []() { V( d8 Q! y6 M4 X4 N8 g
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
5 w8 X6 A" K: l5 h8 d });" ^4 m: C) N% V/ N) O) Q: u
- M' f2 Y+ D. H6 Q: c } for (size_t jj = 0; jj < vec1.size(); jj++). ?6 X: g2 Q1 F w- J* C
{6 n( K% O+ ^* ^+ ]3 O8 X5 i7 X
b1[jj] = vec1[jj];
; E0 S4 m" {% f }$ D- S4 {2 f" J
* f0 \) y4 p: ]" i) T# t% H for (size_t jj = 0; jj < vec2.size(); jj++)
/ G* I1 T& g+ `9 E {1 A3 Q8 m! C7 R- Q n/ s
b2[jj] = vec2[jj];
W( V+ Z z1 m3 d. U }! F( n0 s% ^2 i8 }( |2 r
) c0 A3 Q3 A' a1 r/ F. n) f2 C //Method - 1 N=100000 247s 1 q6 f& c5 h1 e) J: ~0 N
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 Q2 J u* Z: V6 P& F* G! b0 o
8 I8 t" t6 ~9 F8 M
//Method - 2 N=100000 237s8 c) y# c' g% F) T: T" G" l
/*( l; M' N! a! G% P% F6 |. `
for (int jj = 0; jj < N ; jj++)
8 g0 s2 g6 ~- N, O& R. P& { {2 M! ]5 Q( [7 C6 Y
fresult += vec1[jj] * vec2[jj];! ] f; W, [7 G+ i4 _' ~
}8 A( \4 V& H; Z1 l% D" w
*/
9 ^( K, j5 P7 b6 W) ^
, |; y3 w0 z* L0 U. E$ J; ? //Method - 3 N=100000 204s
$ ]: }- d, G. ~. Z. ~. Q1 e; M /* J" R# @; {+ Q" t9 H; l9 }/ W/ Q' l
for (int jj = 0; jj < N; jj++)
' q9 e! n' G/ o) I {
3 D0 K2 Y/ V9 \* B/ s fresult += b1[jj] * b2[jj];
3 h" A9 w& h6 x4 b' d- F }
D: X, ~" t1 G9 b+ C2 i */4 }" |, B$ A7 y- b6 [
, q$ E5 K) W5 v/ x; H
//Method - 4 202s
' K1 k: X" u7 |9 o( f2 u1 a /*- i( ]" J; b& K3 d
for (int jj = 0; jj < N; jj++)# U d5 J& t+ s) ?
{9 G" [$ X* Z4 U; B7 A
2 w( W+ A- C2 q6 Y3 A5 h
}( u# v. D: W( W$ C% q3 [; C$ k
*// l: y2 x4 n- \; {1 D# p2 _0 a
//comment out all methods, N=100000 202s , z1 H( `) P( Q
}
9 m2 p& j+ i$ T) H7 D
7 Y1 o" x0 t5 ~; q {! j& G delete []b1;7 `( ?& e/ x4 B( D4 s8 I8 S
delete []b2; - p' w2 r' c7 e: S8 ~# n
|
|