TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 N) `" {' x& C0 _' c6 |6 `& N" i- O/ P" o
理了理思路,重新做了一个测试。* y. ]4 i* r7 y Z, y/ S
做了两个 vector 和 两个 float *, 都长 1000008 O2 H8 F; @, ]! A( K) f) e
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) C3 ?7 | l( f' ], C' w2 P- n' X c" b0 c! l' L7 y, D# m4 U. T
内循环试了4种方法,) g- [' a5 z V
1. 直接调用 vector inner_product 247s
" E" D4 Y- I/ |+ \5 n* m2. vector 循环点乘累加 237s
8 u6 S; Y n; Q& B8 ^3. float * 循环点乘累加 204s4 _. ]3 v8 T* ]5 p- H$ S' R, a
4. 空循环 100000 次 202s) g& z+ m5 |& A" h6 w3 \
) b+ D/ A# W& l% u5 X不做内循环 200s
! O0 o5 x/ o' |8 \$ y- T' N3 i1 T% g' p
你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 U# b1 A& R5 j" X8 v
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# H- Q* o2 p0 M, h8 \
/ I- K0 u2 `0 H F3 @: p ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
7 \/ G- @1 h9 a
9 P! m9 b& z% y! v4 z' d* F' O(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
" O/ A% J2 [& m# H+ M1 _& y4 u; x7 x }) m: Q+ @ \
std::vector < float > vec1(N);+ G2 W O' H- U) u% g4 Y% J( u
std::vector < float > vec2(N);3 _3 \! P) ^/ q: [. [
float* b1 = new float[N];
1 ^; u2 f( a6 n float* b2 = new float[N];. U5 x6 |* R8 q; ?4 H
. C2 r% B! c* d$ s
for (int j = 0; j < 6000; j++)( n5 b6 a$ s. I$ g) I
{# N5 l0 T( I& ?' J
std::generate(vec1.begin(), vec1.end(), []() {. y6 l! N9 t1 {: P, ]5 _0 P/ c
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;& z2 C3 g0 M" O/ I1 u5 l
});
0 U" Z/ F5 x9 q9 u( S! B) `( G4 n9 l, U2 I+ Y& S3 L7 i7 d0 v
std::generate(vec2.begin(), vec2.end(), []() {
- c1 O$ @: W" ~% W' e" t& _! k return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 l! U; ?) ] Q0 d& u
});% X* u. h' a7 ~! ~# `4 v
; S8 _# A/ f5 K/ \4 G9 Y/ `9 Y for (size_t jj = 0; jj < vec1.size(); jj++)
, r! {1 h; i5 c1 O o {8 {: D% D; a. i1 B. i& e! t
b1[jj] = vec1[jj];9 t( G! N! a! B) Z# {1 L- ]
}$ h# R' t0 i) U( \
j" s% C' D v% d0 t/ X, | for (size_t jj = 0; jj < vec2.size(); jj++)
9 W5 p' o: m* Q$ f4 M; r/ o7 [& ^ {' z: x: g9 L* d
b2[jj] = vec2[jj];
# J* ^% ^2 B$ p$ v }5 r4 n& j& C, U1 h
, k. n* k* W: X. X1 |$ I //Method - 1 N=100000 247s
% G! Y5 O. ^. l' g8 ]% q //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 ?' v: a4 M5 k: F1 J' b4 G
3 ?: z( S C+ R( v2 i$ \
//Method - 2 N=100000 237s. z. i, e+ d/ W- ^% H" s% z
/*+ Q8 v Q5 |5 C$ o6 i
for (int jj = 0; jj < N ; jj++)
$ H7 n2 J/ @' Y/ R& Z {
! R L6 D5 P- R fresult += vec1[jj] * vec2[jj];. W5 _% q& ?- W0 c& y" _
}
! V" V( G* `6 W0 ]$ v */7 x* @* H- ]8 a! M
6 E* P7 K/ Z( L6 Y //Method - 3 N=100000 204s
% o. @- K. k9 k; a4 L /*2 Q% g% o/ v3 n& i
for (int jj = 0; jj < N; jj++)
& q% W/ f( `5 x {, g, m: } V: H
fresult += b1[jj] * b2[jj];
. n1 S3 M7 g. a T7 O* E+ w }
% \! o5 C( m4 O# K# @) s */
: Y, L- u9 g/ r& `' X
- I5 i5 C2 O. q# k/ l2 w //Method - 4 202s) e7 K* u! d8 u+ W( c& s
/*4 c2 k( S" t3 S9 }4 ?4 Z% [
for (int jj = 0; jj < N; jj++)
9 S7 H& K) ?+ b1 ~4 \ {
( e7 a; k5 M$ C6 G. j% n! W
/ b* y; X+ a1 ^ }
" ^1 {$ a! @" m% S6 ^ */
5 ]4 J6 R+ i* g( ] //comment out all methods, N=100000 202s
% ^) f A: [1 C }
) [4 w# |9 i' v$ p* k& D8 X1 P, _$ i- A
delete []b1;
d/ }( ]' K6 ^3 D% C delete []b2;
1 a- q; ~. c# k, h! p) J |
|