TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
1 t# A( k9 ?4 p$ A* C' k$ c- E
7 D$ V0 ? c/ g理了理思路,重新做了一个测试。
0 c! S2 y; g3 H: H" [8 g9 w; o做了两个 vector 和 两个 float *, 都长 100000' O$ B6 r6 i* E' a
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 R3 v5 u7 u+ J/ q' L2 N
! j5 H+ b8 d& Y3 D5 q内循环试了4种方法,
5 ]% B: n1 s0 {1. 直接调用 vector inner_product 247s
* z. Y6 B, N* p2 [2. vector 循环点乘累加 237s- h: l) b" I4 U% q( X
3. float * 循环点乘累加 204s
, f/ i2 i+ K4 m$ K# r/ [/ t2 _4. 空循环 100000 次 202s
; ~8 w% i$ Q5 H8 R5 o9 v8 {: _7 t* z: k# ^5 |
不做内循环 200s7 v q4 ?. r- ?' R" J
' v: W9 [2 K9 V- s" I你昨天说的对,内循环本身占比是很小的,大头在其他处理。
: ]) ~! h; f1 i( D另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* {: |$ g8 Q- c" Q. l5 v$ x8 E
$ \3 V' o: l! k" _. K3 }- }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# G. v; o: o8 ]/ _$ c. v( K2 e
! B& U; H/ _" v: y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)5 B* r, K8 ]$ i& P1 S( \( W
B' Y, t/ z# C4 [1 v9 m; F( `) X4 _ std::vector < float > vec1(N);
" [4 F4 _9 f- k: W std::vector < float > vec2(N);7 U- [" ]6 C( U \0 [$ v5 J
float* b1 = new float[N];& B( }- N* n4 v& a9 g+ H5 N7 v- q
float* b2 = new float[N];" K: L& T! y% r4 ]/ G# U( w
3 @$ J3 h; W1 f7 @ for (int j = 0; j < 6000; j++)
* |/ R q, S( p* | {
! H* e. c- |. N7 W$ u9 z- n) h/ O std::generate(vec1.begin(), vec1.end(), []() {
" Q. _, c" h( v/ a7 L return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" r2 ? B4 z" \
});
4 }: f7 | D" Y2 q- m
; N3 U6 y$ I2 S9 @, ~& a std::generate(vec2.begin(), vec2.end(), []() {6 }0 c2 O0 X, i& c% A
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 B, |6 `+ T- M3 K });
- `) k0 T! E2 c! O9 y- {
+ k* Z# `7 |" x, f& p; |1 k" Y for (size_t jj = 0; jj < vec1.size(); jj++)5 w6 x% X& X, `
{
& e5 U, O7 r: D' T M7 L. \8 p b1[jj] = vec1[jj];& }7 ]- d m9 d
}8 K" K4 Q0 L5 T& |2 n
- J% u- K$ c. g/ q1 A4 \8 ]& L+ t for (size_t jj = 0; jj < vec2.size(); jj++)
5 O2 O* W8 r8 a t: A' F2 I5 Q {& k5 \+ K4 [) m/ ^8 X0 P
b2[jj] = vec2[jj];; y5 Z0 j% U* D% A( T2 D
}
7 F( f$ P6 A9 v/ c: w! G
7 o8 ~$ x, G( h$ ^. I3 V% W. j- f4 r //Method - 1 N=100000 247s ; |0 E. {' g6 [: V @
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
# Z/ t. O+ s, d1 R+ D2 A 8 L4 g: F3 |2 ~
//Method - 2 N=100000 237s/ f3 k' p; \; b9 _5 P; k
/*1 k5 r# _9 W+ f" A3 L7 N( F: A. P4 ~
for (int jj = 0; jj < N ; jj++)5 e4 l; f5 p$ W# D" g( E {0 i
{& ]: l' g3 w* q0 N3 d. j
fresult += vec1[jj] * vec2[jj];; p% q& ~. v& s% I& n7 c
}8 _! @* ^5 W& U; b
*/
z/ ?1 q2 E3 x0 E! f1 x5 A 7 D) D7 b% |2 J$ H! `( u' ]
//Method - 3 N=100000 204s
1 [: W. W/ f, u8 N0 ? /*
6 C) {6 Z! X j; y5 L1 o for (int jj = 0; jj < N; jj++)8 N; E7 t3 ~9 G6 I& r
{6 D1 t, W/ X9 P4 n R+ u2 |. } c
fresult += b1[jj] * b2[jj];5 [" Y0 n( x/ L: a; U$ [
}4 O/ Q. n. G2 r2 e6 C. T& C K
*/
' R# F+ `$ ?- L* _2 Q, t- ^# F% ?) l' \& U
//Method - 4 202s
+ ^$ d, q4 T+ _ /*
2 X8 ?; Q: B' }0 ]: n/ F6 I for (int jj = 0; jj < N; jj++): s2 p7 P6 \* K n4 ~5 b
{8 k) l7 H5 Y1 v% g/ [1 R
, y4 m; @0 o+ J( F* H) c/ P( y4 c) w }
9 J; a" u" i* n9 R0 j$ P */
3 w; j8 C2 h, G ~+ n# l; S //comment out all methods, N=100000 202s
1 Y$ r$ n3 m3 k& P }
1 |: [& q b* n/ I& @+ W: ^' k, ]. ~, n" f8 \
delete []b1;
$ d. T& J1 U" L$ x delete []b2; % g5 w3 S+ e4 n) @* d5 v# o' [
|
|