TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
z, q' ~6 X8 q
7 @# D. }( B% U2 S( [4 ~理了理思路,重新做了一个测试。
- [ A8 t( m' k# y% |做了两个 vector 和 两个 float *, 都长 100000- w/ ?* k+ C# m
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." ?5 i* d) L4 M; Q0 Z$ d9 s6 _
% o) _0 D4 n5 Q" V内循环试了4种方法,
: Q+ E8 U1 p- F# S1. 直接调用 vector inner_product 247s
0 K8 J/ C- R- Z2. vector 循环点乘累加 237s
7 g+ [$ \* @" Y5 s, ?1 J3. float * 循环点乘累加 204s
6 b& {8 T$ l3 O4. 空循环 100000 次 202s
& I& i9 d1 ^6 R: e
. { Z$ ^& H( N# b不做内循环 200s0 ~; Y6 ^, J' T0 u
- D* Y* F, S/ L5 d
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 O% x& P: c& J" D- q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
1 `5 p! @ h$ w+ m6 Z4 H# Y# J6 W
1 w! ~+ p. s4 t至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# a) f& R0 T+ c# }) u& j3 \
2 h O8 j) \/ C
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL): D2 i0 v" d. Y6 [& T
( } H8 x" S9 B- V
std::vector < float > vec1(N);
% Y/ u f& g! X0 b U8 x std::vector < float > vec2(N);$ z- t, {6 {. }/ f; V" A6 A/ a
float* b1 = new float[N];
5 K) q( N# W' y% m2 G3 p5 E P float* b2 = new float[N];
- c- w1 u [" U8 V. }1 u& S4 a6 @" f0 Q
for (int j = 0; j < 6000; j++)
* G7 W. R; Y( ^0 I# j {
" f! q7 s* o5 X9 { std::generate(vec1.begin(), vec1.end(), []() {' L: \6 j- T6 _
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( i, J% X6 L3 L });* L3 P- c' ` i# z. M: U. m
x: L) h) u9 e$ ?* p# m: c0 |* e4 A std::generate(vec2.begin(), vec2.end(), []() {5 L# X1 w4 o; `% R# ?
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ n/ c' G, |' [: Y$ K
});: Z( `/ Q, m" [' U2 c3 O) e
2 ^/ Z6 s2 Z _) i4 w for (size_t jj = 0; jj < vec1.size(); jj++)
3 a0 H4 X% b P1 E; k. J. k$ t {
2 O. o* ]) W9 c* K b1[jj] = vec1[jj];* i3 _4 q- n7 `$ T
}
3 T9 C3 P% {% c1 G" _! ~
9 ~) Z1 T: w! _, |6 \7 D8 A" D for (size_t jj = 0; jj < vec2.size(); jj++)
6 o3 p, a( w1 x: M5 O% S( x) D {
5 Z# v; b% K* N4 p b2[jj] = vec2[jj];% A+ j2 n# c1 t5 M# Z
}
/ A8 T$ e6 q9 t+ s8 {- b0 s9 m ~9 C7 f1 ^5 E( T
//Method - 1 N=100000 247s
& d; @$ r, L0 `. I" \) m: N //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 Z% P2 B- I1 o5 W9 j
' M9 s, l: p; P9 L7 x6 Z& H7 L( \) y$ \" G //Method - 2 N=100000 237s
' b' }7 M2 g- i$ t" s /*
$ v, [) j2 S+ J/ P' Y, g8 { for (int jj = 0; jj < N ; jj++): X" I# {7 O2 {/ `, E+ L
{- f7 j5 G' v4 l( j; i4 u7 O
fresult += vec1[jj] * vec2[jj];0 | ?4 @ J5 ?* [# i9 ]
}
; X {) U7 @& t" f" I: q X6 f* I */6 v8 p7 p, S' | x( j8 z, S7 x
, O$ H6 M9 `0 y4 @5 t //Method - 3 N=100000 204s' z; I) @5 Q! X! I7 h/ J. i' y. B
/*4 g! d8 v8 t. V1 A
for (int jj = 0; jj < N; jj++)
0 R* {* _ {5 K2 i8 j0 ` {6 |% s5 ~% ?) Y! m) z
fresult += b1[jj] * b2[jj];
+ `. _6 u0 P! x" ?' I }9 |) W# U/ _9 J1 s- x
*/" S/ @! W6 ~) s+ Z
! v( j9 E9 K; X K8 ?3 y; s; q5 |& d //Method - 4 202s
3 q( r- A8 M" t4 m /*4 J# e# `; O D$ h" V
for (int jj = 0; jj < N; jj++)( p# b: t* W) a
{: V0 X: p3 ]7 D9 D
# a0 X9 d7 ~5 m& V; {) k8 M$ _ }
2 C* S! W, B; e3 F- d */9 H% E/ i! D5 R# G
//comment out all methods, N=100000 202s
7 ]) i( J% A% E$ _' k7 F/ T }4 e# Q3 j/ o0 M" C" K* \3 F1 n6 a" C, V
" u) h9 W5 ^2 j, P! S2 Y2 N
delete []b1;
% k9 D1 Z1 v6 B8 f# e delete []b2; ) p, u0 I- ]7 d: @
|
|