TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 e" ]; {2 X a' M
+ ]4 C2 h9 I& o+ H* z2 Q$ W
理了理思路,重新做了一个测试。
) U G% ]6 C; Q# p6 Y4 B% Y: B做了两个 vector 和 两个 float *, 都长 100000- c. l0 P. d; m7 `& x
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
. I" m3 W U* t" T6 l2 t" L& A3 f' a9 P6 x* G* z- j; E9 k
内循环试了4种方法,
' c0 T1 [) Z3 u) w: c1. 直接调用 vector inner_product 247s % R8 J, ?7 @' }
2. vector 循环点乘累加 237s% _* H' I4 q& W3 t8 B
3. float * 循环点乘累加 204s3 z0 j3 E# `; K `
4. 空循环 100000 次 202s' B3 b) F: o+ T- S6 m
; I" C5 ~$ {& ~2 H
不做内循环 200s' R5 a7 }2 Q% F( U
! G# x, q! P6 o! j4 J+ ]你昨天说的对,内循环本身占比是很小的,大头在其他处理。( b7 d0 _! [1 m
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ ^" H3 b' Z" r
, P* D' _5 A; k$ N* R$ M- `
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
6 ^5 b3 ?' }0 ]
& b! R+ Y5 e% E% ?(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
& `; N3 U& Q3 D; G" D1 J' c n9 y# `$ V0 ^% @
std::vector < float > vec1(N);+ S: @( G* P% O J
std::vector < float > vec2(N);
3 D! A$ e- K. [7 W* F float* b1 = new float[N];
% |9 s: \( ]' q2 @. ]+ T7 q- ~ float* b2 = new float[N];
' b/ E+ W) _1 W2 q" R8 O& S
. S0 \+ B3 n$ Y- v- } for (int j = 0; j < 6000; j++), l! z1 {9 B: h! q2 A/ l3 z7 e* S
{1 Y: J0 d5 e( _8 C" v6 u5 N
std::generate(vec1.begin(), vec1.end(), []() {' L" Z' s! s6 O( K
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- ?4 @, S8 k( `" S* T( X+ l! k$ R }); U: x9 S3 ^5 p7 c9 q0 b
! L, e9 v$ q3 l7 o% u1 q4 ]& V) u
std::generate(vec2.begin(), vec2.end(), []() {
* J n( [( o: \0 d return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
+ r! N& e2 b6 R+ o; F/ c });
9 l/ I- W% G2 u ?# P( u p$ u; C+ g. G: A$ l) D( Q0 Z
for (size_t jj = 0; jj < vec1.size(); jj++)
* t7 c2 n6 q" X, T9 H/ s) n {
- |9 P0 h" v/ ?3 p7 ~! I% L b1[jj] = vec1[jj];
; ~5 R S7 W: p" E* V/ B }- O% B9 F) h/ E3 i
; ~/ w/ O& h0 K7 s N6 Q4 O for (size_t jj = 0; jj < vec2.size(); jj++)4 T# R$ j' g- j& @6 Q3 p
{
) o" f; ^* ~6 |3 } b2[jj] = vec2[jj];0 t! h% u' I, R! U- E# Y! Y
}
K$ z6 ]5 s8 H( k8 N: X5 N( e
3 w: @# X, {, V //Method - 1 N=100000 247s
& d! ?, u1 Z5 J! \8 Q8 H //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 F, s3 a4 g8 e& C' I0 D5 ]
& |2 X9 E# F5 t7 g* X& S5 `% T4 c
//Method - 2 N=100000 237s" w/ R9 H+ U; ^ W6 U
/*% P4 W8 P$ k. P. X e! m; \
for (int jj = 0; jj < N ; jj++)
7 L- ?3 ~6 {( E7 l% P3 |7 }- x, l {' R t; u- {3 s0 g+ ~; F
fresult += vec1[jj] * vec2[jj];7 T ^. J7 g# m
}, Z; V; @3 `% u1 E6 N4 P
*/
# j! b% [' i5 n) H( B( S ! l S; N& {* E4 C Q0 ]
//Method - 3 N=100000 204s
2 E0 F% b2 H$ `0 o /*
. R( C g1 O' G1 U+ C6 }$ |( {0 B+ X for (int jj = 0; jj < N; jj++)
8 U* k) R1 y K7 W& n {, R; u; H% |: U0 f5 Y6 E* R7 R
fresult += b1[jj] * b2[jj];2 f. x4 l8 K0 u3 r( `( `7 P' Q
}
- H. ~/ J: X5 K, ^$ ~ */
6 E; e3 U$ y- s; l1 w% \- ~
4 i7 U$ p" J" j% O3 p3 v //Method - 4 202s
/ L2 S$ |7 y. _: h /*& C! z& O' p9 R, }0 ?) |
for (int jj = 0; jj < N; jj++)- n, K& H. _+ S% f0 B
{/ @; v$ M% d! i3 F0 z
* s' W7 J; T) ^5 a G& ^# O
}8 u0 U5 E' m7 e7 t% ~7 t7 J& f
*/
" v, |7 h. j2 d5 G. J, Q* n //comment out all methods, N=100000 202s 7 E) A! z, f$ T% A# {4 {" V: ?
}9 \- I/ N- a; x1 v
2 p2 U3 F- E4 f) E7 y
delete []b1;
7 V ^9 M. E+ a delete []b2; . n. ?, \8 E, x( P' U# E( S# a* X
|
|