TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
3 @3 }8 X6 I# a! J/ r3 Q' k/ A! l2 P! F: ^* `; y8 p3 |
理了理思路,重新做了一个测试。- z6 c) t; e4 z4 P5 F; k& u
做了两个 vector 和 两个 float *, 都长 100000
! V% V' S2 k5 H% h' Q3 n4 n9 z2 Y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., N" A3 L5 `2 A) l
$ c! r* x8 z" ]5 Y5 g2 Z" i# ~
内循环试了4种方法,
* I8 }- q, P* n# X) x0 t1. 直接调用 vector inner_product 247s
1 c X2 e. _ z l, u q! M0 f2. vector 循环点乘累加 237s
P8 ~1 l/ R. ?& l1 y# d' m3. float * 循环点乘累加 204s. a( a; r& _6 ]! e& G
4. 空循环 100000 次 202s
' F; x( o" r* _" X7 k2 G- s0 U% e0 P/ n5 S
不做内循环 200s2 j( G; q9 Q/ p. y5 w
5 q/ ^* f% R) k9 J% \
你昨天说的对,内循环本身占比是很小的,大头在其他处理。( R$ G- }. T: \9 z0 o
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 I* Z4 C! D2 s- X4 m# D0 n, B
1 g! y& m' n$ ^% v
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
' I7 y( ^2 f/ \0 V- t2 X: b- m; z& c" E2 m
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 y, Z4 S7 l; f0 r: O
\ b. i. ~3 Q9 } std::vector < float > vec1(N);
. U3 p, C' x |- q( i std::vector < float > vec2(N);
) d* t& B; J, h! G float* b1 = new float[N];6 D+ o' e' X3 m+ i% `
float* b2 = new float[N];
1 V% @/ {( Q: c' }; y+ b
, ]( Q6 _% K" [) D4 G* | for (int j = 0; j < 6000; j++)
- Z1 D6 ~+ f u; C- p {6 s3 O* Q# N- H* r- ~
std::generate(vec1.begin(), vec1.end(), []() {) Q3 b. s) T4 M) W& h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, Y- t3 d, t b& | }); o, R- l" y8 c; r3 `! a& ?
* J: C0 u6 L! G4 q1 m std::generate(vec2.begin(), vec2.end(), []() {
6 N4 j% L6 j5 W4 T9 ~) o+ C return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! Z& {1 G) r* j- T! v
});
0 U- {2 l9 L5 U/ V& C2 q! v: L6 K8 P$ \- g. H( b: g
for (size_t jj = 0; jj < vec1.size(); jj++)$ i u/ x& X# N' ]4 d9 B. H
{$ g! R6 [- ^0 K4 M# B
b1[jj] = vec1[jj];
* J/ H* G' O1 N# {7 K. [, N }; r( T. ]; q* ?5 Y h) V0 ?$ Z
( p* P( r: ], h S- Q for (size_t jj = 0; jj < vec2.size(); jj++)
+ t7 j/ A( I' }/ R {$ E6 d% c1 @4 |: A2 c
b2[jj] = vec2[jj];
; {7 E, q" M3 q3 y( D5 U }9 }* @3 I' J3 G6 @. _5 O
; C. ]: ]- I. ` //Method - 1 N=100000 247s 5 c+ Q6 l1 K1 j% u T
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 ~) V% n9 \" U& l; x# y, X ; z; N0 m& `9 O. {
//Method - 2 N=100000 237s
% u/ g) e# j9 l! j' K Y% } /*% ?, @6 I. Y9 U+ J' V
for (int jj = 0; jj < N ; jj++)0 `' x" u4 o( l& I$ i9 _" c
{4 c$ H' r/ o4 Q& Q' [
fresult += vec1[jj] * vec2[jj];
9 J0 h, T B! _ }
+ t$ G; d0 |; g */
. K8 M6 ]* v e " E: X: [. ~, z
//Method - 3 N=100000 204s
0 J( ?( E( X2 ?9 D! Z$ U /*
; u4 L0 v3 o" Z" e" H. d7 q for (int jj = 0; jj < N; jj++)
' N# m, N: N( L! p% @1 Q& b {2 [+ X! s' g( p4 @& H: \/ h e! @! e
fresult += b1[jj] * b2[jj];
; B3 t8 \& w; p! q) _* O }
$ J# ~; u2 w1 P3 Z6 Z, ~ W */. S+ a. Y9 i9 Y1 f' a1 [' G" e
$ u0 b6 o8 ?% S+ g //Method - 4 202s4 X+ x7 w- I5 p a: n9 I
/*) A/ R) A; ^7 z: D1 H) x
for (int jj = 0; jj < N; jj++)8 z1 M/ ~1 i# t, f0 b3 a6 p
{0 c% U a7 f1 H: I7 h5 H
: R9 X$ Z3 o" n3 R6 a( g) Q }
" P7 v+ k9 |- I4 x' `; @ */
/ A2 U2 n1 U" e //comment out all methods, N=100000 202s 9 c' }6 v/ g2 y3 e, ?) G! {
}% A! m$ }: a+ |2 e; ^) @
9 v3 g. ?! s' G7 J+ j
delete []b1;# ~5 Q% t: j3 J$ V: G
delete []b2; 4 B1 B8 H! w$ ~& S5 l8 }. @
|
|