TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 P- [8 B8 u/ m; o; w2 h0 K; V* g5 O
理了理思路,重新做了一个测试。! A; e' J* X4 C( b O0 v
做了两个 vector 和 两个 float *, 都长 100000# x0 N J9 z! C, L2 Q
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. h6 M/ z/ e6 y/ F) F) x
# \, d) C0 O/ s" t0 }
内循环试了4种方法,5 |% p6 M e) C2 ?
1. 直接调用 vector inner_product 247s
C! c: d5 M5 \: t! b S2. vector 循环点乘累加 237s
, @6 U+ ]8 Z5 u3. float * 循环点乘累加 204s2 K7 z) y! e4 d! O
4. 空循环 100000 次 202s' S/ v! w4 Z* v3 E2 K" i9 X
, y, H( ~# k9 E" S: x- l- L不做内循环 200s
6 O* ^% q; w O( w) @6 y$ @5 c: U* x* z- x6 ^" Z& f8 z
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
5 ^9 V. S+ Z9 p9 P/ ]' M另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ t# y+ M1 E& g/ X; R5 r
* S U/ s. `; T% `- X
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; g* u( l+ I0 @8 V/ B4 b
2 S1 s$ ]' P6 Y2 D# Z(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); R5 l. A1 S; u; w) J( Y3 N
/ D% ?& R# Q9 i
std::vector < float > vec1(N);0 P& l0 z8 \. H5 S
std::vector < float > vec2(N);1 c& p8 x- F0 a' g* P
float* b1 = new float[N];% g5 L! T% L& S# c
float* b2 = new float[N];
, s( B5 G ?' ?3 _. E9 B/ n# C# F7 h2 a2 ~
for (int j = 0; j < 6000; j++)
8 Q& z* {, b# f {2 L! J3 ^0 ^: ` k: l- g
std::generate(vec1.begin(), vec1.end(), []() {
1 P: B# r6 ^% T" k. v, A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( q( Z( G" B# Y4 f/ D });
- f L: p9 F+ d3 O# p! O: r% q& {. d0 Y+ `9 N7 B v
std::generate(vec2.begin(), vec2.end(), []() {# Q% [. n2 G& z5 J6 e1 V: {3 i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 x2 X( d( Q( C* f' c3 D9 y" H
});
; m& f9 E2 ^! c3 i F. v
, ]/ I2 M& X1 ]8 D; p for (size_t jj = 0; jj < vec1.size(); jj++)
- v# h- A: D9 w' K; G# W {
! Z* V) D, @7 X! P! a b1[jj] = vec1[jj];
( Z4 y4 U7 m8 q, x }9 a# _7 O3 B& _
4 d( _4 P( M5 V% [3 Z% y y' a
for (size_t jj = 0; jj < vec2.size(); jj++)7 s( A1 X: k8 L/ p8 o
{
% [+ H m$ {: w0 Z b2[jj] = vec2[jj];' L2 F$ l% V/ \) {4 r
}6 I6 ?; j2 F% k+ @$ P9 Z( j" Q
0 i+ n+ V1 S5 ^ //Method - 1 N=100000 247s
2 O: r0 E2 z4 J, o9 Z' [ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' G" O& N; ~: f2 N1 {% s+ S& Y( A
' M8 ~9 X$ F: c+ q8 T //Method - 2 N=100000 237s
3 V8 z2 v. W3 }. s5 L1 x4 A8 n) u /*- Q* V! \: p. M8 n: a5 v
for (int jj = 0; jj < N ; jj++): w# |9 O. w% l) d# y# q
{) f; @ l( Y. `' @7 c( U) {
fresult += vec1[jj] * vec2[jj];
% R' D. P) @4 J2 v$ g3 S }6 z1 { X/ z H/ \
*/
3 L, o2 ^! B/ m0 ^; v9 F5 Q) m
/ l. z0 v1 |3 _4 a //Method - 3 N=100000 204s
, W* e K: _( N /*: {. n; V2 L( F3 b
for (int jj = 0; jj < N; jj++); P0 I8 T% }, b$ p$ W' Q
{
/ C4 T5 }; P0 P/ x fresult += b1[jj] * b2[jj];
$ `$ v! q6 e( C: y7 m" J5 T }) u. c4 L$ I& t7 y5 M
*/
* @* i8 T& v3 w9 _
/ B0 @! u1 I5 {: `2 r' r //Method - 4 202s0 D+ ]4 F6 q. T$ G* F7 r
/*% E! L7 B9 ^% f( _! ?
for (int jj = 0; jj < N; jj++)
) B0 I; h6 d$ c4 v {" |3 |4 e" D1 K$ H# D3 @6 v
4 a5 F, I6 q2 m8 e: v8 s% x
}
1 A6 `, g* e' u; l+ ]0 @ */
% A g' J. L. e, [+ W$ T //comment out all methods, N=100000 202s
& x3 v( _3 j3 r: u. M8 V }2 ]9 e/ {% j# e0 S8 a# p
% K) S$ X. B- N& G- Q delete []b1;
( z# u/ a0 i& T: z8 K delete []b2; * N. M# s' @7 }( b9 R
|
|