TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
7 d5 P# T8 p1 j& @4 d$ j9 ]
' H. K# i4 j; y7 }; X理了理思路,重新做了一个测试。
7 L2 t' e7 @' e! _" ]做了两个 vector 和 两个 float *, 都长 100000
3 M' r# c8 `. v* T外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 J) j4 I: E" w6 |3 @ S( n
$ n4 P U" w% r' w( C4 F, S内循环试了4种方法,
: Y% U6 h3 F! Z5 M7 @1. 直接调用 vector inner_product 247s : n$ f! }+ x K7 a7 f/ K- q
2. vector 循环点乘累加 237s& d# n: l0 R$ A i% b. N( g
3. float * 循环点乘累加 204s
2 ]0 g# F- M, |" t( b4. 空循环 100000 次 202s j* m, c" U% ^6 s; w# ?( N
; ]7 ?3 W m: B不做内循环 200s
+ a' A/ S" g- U& k4 X
( `: H# n3 |: d' A+ z你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 v$ K/ c* D" K
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 A) S' p2 `; ]$ p
# \. l; v9 Z* c& Q4 T1 S
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; _' L `' A! `! R% \# ^7 V8 V6 |0 ]5 t6 Y6 A+ e0 z+ w$ |& y5 c
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% p4 n/ B8 a: I2 E
, A/ b' _/ x7 d5 ^0 s2 s; j std::vector < float > vec1(N);, Y3 |3 d* Z8 Q3 Z" J6 b
std::vector < float > vec2(N);
% x) Q& J8 U. M& W5 z3 Y- X, k( Q float* b1 = new float[N];
, f4 X- A- P2 M7 n6 R! x M2 { float* b2 = new float[N];
$ C, a8 T! u' _! R+ q. r# J
& z' |% W, N1 E4 W for (int j = 0; j < 6000; j++)3 S, a A9 D+ I6 }* W! x
{
' Q+ z- o, w* Z: Q3 B9 m- v4 T$ l std::generate(vec1.begin(), vec1.end(), []() {) b' M! x+ s7 F1 q& K9 y8 n
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, H2 u8 {5 D3 a5 d& ~3 @
});, [, ^$ y* H9 f/ d
/ q2 f& f2 h/ `' _* p9 z: N
std::generate(vec2.begin(), vec2.end(), []() {) z: ~" ^0 }; W A" P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! d2 E) w. u7 P' ~- l, F T
});
/ h4 O& x# e5 Y8 A7 G
: [, f9 O$ [; `6 D- g( B9 B- P* K" U for (size_t jj = 0; jj < vec1.size(); jj++)" ^ Y2 D: i* p0 s% p! u4 u9 C
{ z' `& _0 d: E5 N$ G6 J# _
b1[jj] = vec1[jj];
6 e& ]! f5 o2 g7 M* k6 z }1 Q4 E r6 u' d2 x c3 J- \
9 z- d c2 X4 [: b3 T3 c for (size_t jj = 0; jj < vec2.size(); jj++)
3 l3 k' g: b; n: I8 V {1 T1 E, d, L: j5 _
b2[jj] = vec2[jj];
7 n2 L% y/ I. U# p4 @2 n }
. x! N9 m: x7 u8 v6 M- A) O5 I7 c. R. _9 E: | O& y& Z. d( \3 M/ r3 o
//Method - 1 N=100000 247s 6 B1 } m( @6 h T: G- f( {
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 _6 h7 U; |- T. I* Q
- Q* `" e1 q9 w9 Y4 \3 i# O" k8 T
//Method - 2 N=100000 237s
2 o; J2 T. ?4 M2 g /*
! g* O) @3 N1 J( _ for (int jj = 0; jj < N ; jj++)
% q& k: {% z4 u) e4 ^ {
1 [ }3 o3 I @6 a9 w fresult += vec1[jj] * vec2[jj];
) v, C H3 F+ q5 }. @) l }
' e% e+ J* H+ g& U7 J9 i4 d4 ^ */
" [$ k2 ~( \7 G+ w; o6 l& f
- P8 q" q4 f% S0 V- e //Method - 3 N=100000 204s
: C& A% d+ { s3 _ /*: ~; g' ]/ \, j# \7 s6 v) E0 Q
for (int jj = 0; jj < N; jj++)9 g! ^5 }( W% g) i& i. s0 S
{
$ V7 ?* \ w0 F b& s) c% M4 p3 D fresult += b1[jj] * b2[jj];
X$ o# _& F) p( E/ b: f }9 `; c( s1 i2 d' l6 O5 E
*/
0 C, M+ \- R. e0 A- O; j; O$ }3 s3 B
//Method - 4 202s
/ t7 a1 u$ g, @5 o3 c0 v" e /*
! y2 E8 H& p" h9 h- o for (int jj = 0; jj < N; jj++)
. ]* f5 [5 w6 A {
) V( I9 \& W7 u9 Q4 i3 g9 \
t9 X# v+ D2 i5 A+ x) y/ w }# a0 f' |" J* s# k
*/, M$ |' o/ f3 x. s. z2 f0 q1 n
//comment out all methods, N=100000 202s 4 ]. u% C- [& m, F2 X' G
}5 b2 Y8 X; ~9 c" x
" ]9 ^% y* j" m! N% l
delete []b1;
5 p1 L4 K$ d+ M4 P# y3 x2 _ delete []b2; $ h/ ?4 F8 p5 U$ B- k
|
|