TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 . K+ U' \( y; K3 r
2 }0 @, P! N+ ]
理了理思路,重新做了一个测试。7 w" w i$ d; a6 U" G
做了两个 vector 和 两个 float *, 都长 100000
6 t0 |6 d) j% Z) q4 z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" b% h: A1 Y8 T* k$ }, t9 t# Y( [" U& E$ c: s( v! A
内循环试了4种方法,
4 \( N e9 P0 o4 ^* K& Q3 H1. 直接调用 vector inner_product 247s 4 d- p+ J! k& l% H3 W/ M8 L l; i
2. vector 循环点乘累加 237s, v {1 v% T/ ^, ^1 f
3. float * 循环点乘累加 204s1 j; ?( p B' p4 [( V
4. 空循环 100000 次 202s9 U' @+ v( U9 S7 e
8 R6 [& ]( P& X) h7 N3 z# V% h2 f
不做内循环 200s
# p4 O$ Q6 [0 ^ G6 H' t- R
7 p& W J2 [2 U- s* d你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! P5 ^0 v: S q: s( o% \另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 ^- r u+ C7 v9 t4 E
6 C3 ?: Q3 S: O7 o K. a% ^; M
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)7 @0 v7 C5 u$ A% `
# n5 S1 Q% L3 `" a. j% B7 T(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; }/ v, K( C1 t8 ~
! t2 B1 m; w1 L2 T* w: a std::vector < float > vec1(N);/ y( t# R+ s2 Q1 b0 ^( ]) W
std::vector < float > vec2(N);
0 h9 o! E; r W* G. a& w float* b1 = new float[N];2 B- k5 y, {. e# T
float* b2 = new float[N];
8 ~* }5 o# k* Z- e; l
: F' l* R3 X, U! }4 u( J' P for (int j = 0; j < 6000; j++)( D+ I0 v7 W; `& F& s$ n
{, P) ~# O; x* O* R
std::generate(vec1.begin(), vec1.end(), []() {6 |" }: o3 }" |( X0 G; i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( L( u+ X8 _' t0 Q$ V/ J });
& K w; h3 W8 J6 v. u6 I8 G# C) }! ]6 v, |2 B, z' }
std::generate(vec2.begin(), vec2.end(), []() {' \( D) o( c# z o s$ [. \' [% O
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ L/ ?* z5 s% l2 e$ ?1 [
});
5 v. C8 y2 T( {- y" A0 O* I+ u' l, i
for (size_t jj = 0; jj < vec1.size(); jj++)7 i0 d3 T2 j2 X" A" j% G5 C
{, f2 @6 q6 z2 W( {& c
b1[jj] = vec1[jj]; K: Q( x4 d! F5 n& d! \
}9 a1 r" X1 T3 ^8 d# o# Y) c% t
: k; T# l p# `
for (size_t jj = 0; jj < vec2.size(); jj++)
' V2 {, P, p& u9 {3 h1 P% m {/ X; v9 E6 b7 N4 g) }$ f8 ^2 J
b2[jj] = vec2[jj];4 y1 V6 f/ `: j8 t% T7 {
}
- T7 K' F7 W6 {' y% G) g- c/ i) Y
0 w+ y7 a- a, K1 G* C* K M //Method - 1 N=100000 247s % ]; T: s4 R' _% n, }
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 D( R+ F# c% ]+ i2 O$ J5 g2 u
( I2 F1 b# H( `0 } //Method - 2 N=100000 237s
+ ]2 `+ O( }( I2 i2 V7 s /*; M- ?4 s, |9 \# w0 M2 l3 C
for (int jj = 0; jj < N ; jj++)
+ z7 W9 f# c5 D! Z+ @ {, K% T5 G- |& y
fresult += vec1[jj] * vec2[jj];3 T ~1 f" f( Q6 k0 S7 F9 ~
}* K! b6 u8 Z4 T- N* n
*/
! e# A( I6 ~, y4 |# u, S 0 c% g6 p6 ~ w/ v
//Method - 3 N=100000 204s
" f9 ]0 S- Y0 E /*9 i* v6 C! B! N: p
for (int jj = 0; jj < N; jj++)
! n' l: |8 u$ t6 c% G5 v4 F' ^# m {, u- \4 _7 V, B7 @
fresult += b1[jj] * b2[jj];2 D0 {, {8 J! C9 y3 b
}
' C# [/ Q4 \$ P U% @/ F4 q5 N) a5 M *// z9 z0 l# u& _3 V0 m2 F
9 ]4 a' ]4 v$ o9 a
//Method - 4 202s
( x" I( Y0 M4 D: g6 Z. D3 R W /*3 J2 Z9 |1 o) s. B7 [; T0 Z( Q
for (int jj = 0; jj < N; jj++)
1 f( T1 t+ P1 m, s7 \2 B5 } {" W; J0 h# @/ r6 T+ i$ B
6 ^ V" _7 @* G) H }
1 `) T3 C+ i1 s */3 p2 q2 o7 ^& d2 n" H
//comment out all methods, N=100000 202s
I, X) I( y) S. ?: R }1 W, s# B& O5 w" k' V p% @6 ~
% ~8 { \ B7 \
delete []b1;
, P' G# x: f3 ^! p P delete []b2;
/ r8 B* Q9 o* F- w |
|