TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
7 i2 \) a( J9 u4 j
. b& c+ o a& f4 E; h理了理思路,重新做了一个测试。
% ]) @0 L l7 w1 u5 ^( I' b+ e做了两个 vector 和 两个 float *, 都长 100000
9 o& ?5 a$ n: o9 U2 E外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& ?" _. U1 g$ s6 K- x1 `: E0 j
4 P" c4 s# J6 T! f内循环试了4种方法,
{% F( g# a6 l: y+ w t2 q/ o1. 直接调用 vector inner_product 247s
; Q4 q( z9 [' {) ~* T* ^4 w1 T2. vector 循环点乘累加 237s O5 u( |1 s ^* b0 ^ i
3. float * 循环点乘累加 204s5 C% F; q0 S4 _! \, Y* s3 Q
4. 空循环 100000 次 202s. K! i/ L( p A* J! @* d: x
0 y2 Q& v4 ^1 J* s; K不做内循环 200s" ?3 x8 F. X. y. H- h
1 ^) p; }! c" _( S7 \你昨天说的对,内循环本身占比是很小的,大头在其他处理。 r! `/ q1 t2 k. O2 \! e; L
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
$ ]( `3 \) I, A6 `
. b; |6 _8 Q P2 ^/ r至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! O2 I/ J% R7 c/ y* ~9 t4 S/ n9 s! \
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ A$ a x- |% a5 v6 l$ m. k% V# J6 m
" h/ W+ B2 t, p/ S std::vector < float > vec1(N);. q9 ?" `4 n7 z# ?6 T) F( s
std::vector < float > vec2(N);
. N- N8 b1 A" J0 A- r+ H# K float* b1 = new float[N];
$ g* G5 r3 I! ~1 x+ U& K float* b2 = new float[N];
- Z, e) K, o% |* o9 V/ P Y) D. h7 z0 H+ z$ C5 Q( s2 _
for (int j = 0; j < 6000; j++), n( ~8 `: h" Z6 \( r% A0 M
{1 U. Q+ F( D/ V
std::generate(vec1.begin(), vec1.end(), []() {2 \( ~) v" O r. n' K
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;: {- C, \6 G4 Z6 D. x# O
});' |, r' M- H8 @/ R0 ?( V, `
7 z, Z& l( r, b% Q) Y std::generate(vec2.begin(), vec2.end(), []() {% d; _5 K3 s0 q: X% g
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
) n( y5 Q) Y' x! O+ y });2 g7 @9 l9 H" M+ X. x
! O* P! } c+ e: V* G# {% z
for (size_t jj = 0; jj < vec1.size(); jj++)
+ {/ P' x. r% ?- @ {3 ~5 r2 F2 k1 w' G J. L$ I
b1[jj] = vec1[jj];
2 q( V3 ^! u5 P) n }
- b6 G- i% P2 D0 T# G: \' O1 y( \5 D7 t" d% j$ A, q2 p
for (size_t jj = 0; jj < vec2.size(); jj++) {. P6 s+ O. l# O* F0 B
{0 o4 h5 f( A: Z* \- Y
b2[jj] = vec2[jj];6 H: k" w; J8 L5 C: F
}0 s& d* _; P0 ~7 @1 W8 D* J
6 x. T' S$ I9 X R- L& D5 W! W //Method - 1 N=100000 247s
2 T1 y4 x# {* ^0 S) G# n+ w //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
0 m8 @. r- z$ c# J
. n' K- p$ P9 ^4 H9 P! ? //Method - 2 N=100000 237s
4 h0 c( {6 Q* S1 l7 ^5 ^ /*6 `; D/ B6 g9 K: e6 T* K. n
for (int jj = 0; jj < N ; jj++)2 Z( F3 G- s; q7 i& s3 y% m
{
& \7 k( ?* `$ q" `* Z K ^ fresult += vec1[jj] * vec2[jj];
( w0 L/ h3 V* ]1 f% D }% Y8 M" s; ]5 e1 t& B
*/
7 B( d B& z: \
7 ?6 T6 Z9 O! N4 ?, k8 i5 C4 c' _ //Method - 3 N=100000 204s# b3 R; V, N) {- K4 {+ ^
/*
- K. V% _- Z2 h, E( d for (int jj = 0; jj < N; jj++)
8 F& O! G+ w. ~1 A {3 \3 N; {8 ~, `4 `
fresult += b1[jj] * b2[jj];" W( v; k2 o+ b* f5 A
}+ e9 r1 H1 N! \( L# U0 c
*/- g& p! S7 E- [* \ Y
- y1 V" `! P) f2 e
//Method - 4 202s
, L: \$ m- v1 y* F /*
7 q& `4 |1 ~- D1 r$ K for (int jj = 0; jj < N; jj++)) N! U- Q3 Z+ ^# Z
{
D1 ?7 L! }; b' P; K) F + S5 F# D8 V# y0 h
}
( Y8 Y' _& t7 t9 @( A */: p9 n. V: {" e2 G) {, J* S7 E5 R
//comment out all methods, N=100000 202s
% `+ ]) y6 A2 \- J }
$ u5 N) |) I+ P( n: n7 w/ a" D0 J8 i0 a9 H
delete []b1;+ N: a9 ]7 f6 B4 T# W( t! ]1 r
delete []b2;
/ ?- E! U1 ^, d( q' M9 t/ k |
|