TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ' ~2 A F! e' L9 n
- X5 ?8 e9 M" }2 [0 }
理了理思路,重新做了一个测试。
6 h% M) z8 a, U5 h3 I: b2 E做了两个 vector 和 两个 float *, 都长 100000% K1 v9 g2 E y9 e
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 g2 s8 b$ G8 W( N" G5 M8 r- Z
+ f" |1 Q8 j/ F内循环试了4种方法,! H! h% X- O$ w
1. 直接调用 vector inner_product 247s ( Y: @$ g! G' X8 E
2. vector 循环点乘累加 237s6 B% D: a' H: ?. v' G7 Y
3. float * 循环点乘累加 204s' Y7 X3 D0 d* T* M& G/ N# l
4. 空循环 100000 次 202s C% f' `( H! {. q8 u& j
" p+ C9 p( {3 U) }不做内循环 200s
2 f7 _1 P' p2 O
% @; P. ?& j* l你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 f! t$ z& z/ ^) E/ C ]
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; i5 ]- H2 K" {5 M! j- _
$ H5 O1 m- g' i7 Z6 T+ `至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), S) ]/ H% d+ y6 s/ Z q( s
0 i$ a4 e4 w s( P4 h- c2 _, `. `(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 j# w* q) x y" q* S1 ]& r/ W
, M. s' ~# _/ K5 G- f: D, f1 C4 V/ S
std::vector < float > vec1(N);
& G, N. i0 }' C2 ^1 f ] std::vector < float > vec2(N);9 s; c& T& k: U/ T/ B( N. [: E! Q+ c
float* b1 = new float[N];- D8 e+ \6 @( f5 e) D, c8 o: a
float* b2 = new float[N];0 N0 x$ y- U. S
9 z: H ] \- z
for (int j = 0; j < 6000; j++)
/ H; J3 I- T: Y {
, p. x( M* Z* I0 E std::generate(vec1.begin(), vec1.end(), []() {
- u+ H+ `+ _' X return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 h! ]) u! G" x1 Y2 N
});/ b$ x2 L- r2 o% L
" K" X" `( J6 f5 y) b+ _
std::generate(vec2.begin(), vec2.end(), []() {
) ~; \2 p* H* U/ Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# Q( ?4 O) }/ H2 Z
});
: l2 K4 t' F8 ^9 j3 S
1 u4 Z1 Q+ u" H% Z for (size_t jj = 0; jj < vec1.size(); jj++)6 F0 o' X/ v3 l# B
{
5 }, n. J% `7 J0 W4 K( O b1[jj] = vec1[jj];
$ j* C; ]" s8 x }
8 W; v: ^ S8 H/ z1 {- D! D7 E0 t- l/ V" D P. f
for (size_t jj = 0; jj < vec2.size(); jj++)4 ^( \7 z( d, b- j
{2 J+ |# b( z! g2 z# U4 h
b2[jj] = vec2[jj]; V+ \* H6 B( Z& }. }( J/ L X
}; F$ x- S) ~& s8 d6 u: o: Y1 Q$ b4 ^4 l
0 ~, @1 w; L# L3 C' N5 ^4 G //Method - 1 N=100000 247s
& D/ Q9 H6 v! e+ Q& G% S //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. _! l: k, E4 x. t. {$ @7 W
8 l. f& ]2 K, J6 D6 Y
//Method - 2 N=100000 237s
4 z$ u9 \! V# H. w/ O. @4 z" z! H /*/ U' ^9 X# o1 J+ [: Y' v% d
for (int jj = 0; jj < N ; jj++)
5 r1 d- J$ c/ q: t& s/ @1 r {" ^* b. L# n9 g
fresult += vec1[jj] * vec2[jj];
O* |9 ]6 \ P) m5 { }+ {! N+ j& w9 y+ a$ G' c
*/
* z* a2 y% W0 h) n
% _8 C6 w1 S: w4 y, n# H: o/ G5 O //Method - 3 N=100000 204s8 f6 C9 c& ]7 h2 ]
/*
2 F2 [% L& V2 J) @. m for (int jj = 0; jj < N; jj++)
! W9 j6 U: M1 M, \9 o: _9 Q3 G/ p! { {
2 w* a3 j; s. m' f+ A fresult += b1[jj] * b2[jj];
: K0 I. d5 Z) A2 G }4 Y- m( }- F; p$ _/ d; w
*/
) ~1 }1 }: Y) O q$ M2 R& K
[2 f/ o! ?. k0 K9 O //Method - 4 202s
7 h- c$ Y& x# H& }5 T /*% M! K0 y; f* }5 T
for (int jj = 0; jj < N; jj++)
/ B7 F8 O5 T: s1 O3 D8 I( b {
1 x2 P1 J* F. d/ m1 n# m) F. u
! d3 p8 O0 p; [. H7 b }/ w6 W# |, r* e& ~9 F5 t8 k) F* _
*/
( f: w" l! @2 i. M& T b* A* i //comment out all methods, N=100000 202s ) h9 W4 w' X% Y* @
}
0 I9 J- C5 k1 G2 c: H9 K* Q( T: w. A' Y- N* f( D4 J& |
delete []b1;; E/ k2 d2 e( D* r% `
delete []b2; 6 Y# A+ D1 K0 a+ z' U
|
|