TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 J; V! P) d* p/ E) T
; c8 e7 N W3 ^9 t理了理思路,重新做了一个测试。
5 b6 ~2 Y$ Q" A8 U8 ?做了两个 vector 和 两个 float *, 都长 100000
/ X0 i! |5 D9 c外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
1 P7 {& }6 C$ y+ B0 I" h
* S8 p' R0 T$ J: Q3 m内循环试了4种方法,
4 O! y p# T7 U/ P1. 直接调用 vector inner_product 247s
4 Y5 P9 I6 F$ j6 Z) ~4 c2. vector 循环点乘累加 237s
; \8 C( R/ a3 \* ?3. float * 循环点乘累加 204s) ^$ ?# U7 d* d6 ?
4. 空循环 100000 次 202s
4 I; Y7 F8 x7 r) @
% A( B, l# c9 [) a1 _: ~+ r不做内循环 200s
+ [& u! s4 N, n1 S1 [, O! p2 \- N* y9 o& }# A
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 O! m7 _+ H0 I, \! U" @! u另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
: p% B, ?# k: L( Z% m, v
2 n7 a+ K6 y: c1 J H: [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), Y6 ?# I1 c- j* b
/ j5 \( f* {1 T(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
]) Q' ^* Y7 y9 g, }, R7 B: f
0 ~4 L, [7 L6 N std::vector < float > vec1(N);
, }4 L A1 i2 p1 }+ g8 b+ `& D. T std::vector < float > vec2(N);
, B1 g$ S2 i' ], T9 {, p float* b1 = new float[N];
" O- ]8 B% i: J- @; M( S float* b2 = new float[N];. C6 b2 d& ~, U$ L8 q
3 Z* p* N+ g: B for (int j = 0; j < 6000; j++)
8 E3 E. \, R+ B- U8 n {5 b, H$ @9 f1 {$ f j" \
std::generate(vec1.begin(), vec1.end(), []() {7 N2 d2 g6 U1 s+ }+ x
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
; s/ V" |2 ^& o) ] });% G4 b( ?. P( |
) n5 }# E! H- { std::generate(vec2.begin(), vec2.end(), []() {3 C* }. B' h$ u+ @1 ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! G; j1 U2 ]4 h! s, M$ Y( k });
( T' l+ Z: P, a+ \9 M
% C) f# d: i8 l3 T$ J |* l' o% ] for (size_t jj = 0; jj < vec1.size(); jj++)
[1 ~, C5 y9 g+ Y! ~ {
8 z, H3 q$ F. U( H5 v0 i2 E b1[jj] = vec1[jj];
p& I+ \' M7 \8 q! D' t }
& |+ b+ e8 s F# O6 P
K. e1 m ^9 a) ^5 o- b+ s& f for (size_t jj = 0; jj < vec2.size(); jj++)0 u8 n9 E+ T5 e5 ~% G
{
$ m7 n! K% R/ U9 B7 F7 s b2[jj] = vec2[jj];
$ Z/ _1 h h9 D }
' W2 }" c1 v! c
w3 a! x+ ]( A& c9 d- d; U3 y //Method - 1 N=100000 247s
1 V. D1 q( z4 J0 } //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
! C1 A* b3 z; H' ? 2 f# |: O8 A$ Y. }, ]) {0 D4 I: v
//Method - 2 N=100000 237s
! Y6 R6 h' Z, D/ J: y% L4 E /*
3 D/ |- B. i: g) ] for (int jj = 0; jj < N ; jj++)( V* A: j; @, q- }
{6 {0 K6 J# P$ a# q. d5 V
fresult += vec1[jj] * vec2[jj];9 w6 ~/ a+ Z( H2 A. R
}
' g4 [( q, L5 n9 Y6 M */9 H9 C' [1 G5 {
5 }9 D0 {3 w9 z/ E; h; Y" [
//Method - 3 N=100000 204s
! R' o0 ^4 L [. T6 q$ R7 o* m8 H /*, C- G5 @4 o5 v
for (int jj = 0; jj < N; jj++)
3 g9 I6 q J. F {4 f6 K4 h9 A$ h( A: n
fresult += b1[jj] * b2[jj];
/ n- M O _- k% T$ t! A }
( P, C. F$ m% E */
7 g$ ^- @$ x2 Q5 S' ]; L
, l2 \; A3 B7 X5 Q3 p6 _, P# U2 [ //Method - 4 202s' g6 w1 ?$ m; r& ?
/*
) |6 p+ N! @% R d8 p5 g0 v for (int jj = 0; jj < N; jj++)
4 I5 K: a) n8 S0 r {
: o# k/ y+ k+ e3 j7 a
- e+ Y! {& ]9 o) X }
" o" ?! s, l8 T, G; k' | */9 K' G: O' j: B3 {. ]. t4 ]
//comment out all methods, N=100000 202s 1 ^7 @( E4 G! a( ]/ r6 W" \- m
}
4 x4 a) P/ n7 w+ G
* P7 P* F0 {0 |7 V- u) \2 @ delete []b1;6 ?# R3 s8 t3 ~* D9 p
delete []b2; % I6 X4 }( ^- G# E! |' l+ A
|
|