TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ S/ e* f# c0 U( w% }/ @
5 |/ @% J7 Q' O理了理思路,重新做了一个测试。0 G) J) b- X& s9 S8 O7 L/ g6 K' i
做了两个 vector 和 两个 float *, 都长 100000/ t) @: h3 z5 b7 A
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* x2 k; E- O b2 d4 T3 _/ J+ X4 n1 r
内循环试了4种方法,9 j* o* h9 ~ O F* l& @
1. 直接调用 vector inner_product 247s 7 B2 _5 W$ B, f, B
2. vector 循环点乘累加 237s
1 u% L+ Q, v" z3. float * 循环点乘累加 204s- C1 _' x h& F7 m; G
4. 空循环 100000 次 202s
, C, Y* R9 `' ?, v# s2 \& H! D M+ p4 a) M& @
不做内循环 200s
5 K2 Z8 S6 a' F4 g. r- ?4 j5 L2 z& ]" b5 }- W2 X R
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ Z% `* W: E! A2 R8 I另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! s' y1 c+ m- e1 z5 _
$ `: e9 d; e+ I4 D: \! z5 ]
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
. J0 ]' R# W+ ~, W% _7 S9 j U8 v, O7 \4 ^+ \2 F
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 y; E$ E" B+ M) k- E8 f
- r& L4 w% x' ^$ `% d7 E4 O std::vector < float > vec1(N);* {/ s/ ^$ P+ Q) ]" G8 G8 k% H/ l
std::vector < float > vec2(N);' k$ ~" u+ ?% i3 e* L9 ^
float* b1 = new float[N];+ t1 }( s, n H1 j
float* b2 = new float[N];/ o: n3 ]4 Z, k, x' r
* Y( Q% e7 u& E for (int j = 0; j < 6000; j++)0 _! W8 T" J" R- X) {" w) X
{" _- \0 f6 j5 s' u
std::generate(vec1.begin(), vec1.end(), []() {
* O5 z& R+ n9 T! B/ A2 t' O return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ w6 B9 }0 d# s" C- W9 ]. Y3 @, R# Q6 K
});9 c9 F1 O' M0 u/ m% o6 l; q
: ?$ E1 J* p8 \+ W7 N* O$ U5 L- w; ?# X
std::generate(vec2.begin(), vec2.end(), []() {
* p# R. o6 t3 d( V# I return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
o3 e! u0 V4 n5 r" L });
0 P6 Q7 f. i( ~$ n9 U& u0 N; l0 B/ ]. m* j" \
for (size_t jj = 0; jj < vec1.size(); jj++)
' y( m$ T# Q; q5 y {8 t; N% @$ j' v4 r! n# @
b1[jj] = vec1[jj];
9 A( m. o& U$ J- t. ?1 S }8 j0 P: ~6 k' a( O' N' y3 |
: f; B4 F- Y- R5 F. \- O
for (size_t jj = 0; jj < vec2.size(); jj++)
' C9 S/ S0 Z! v7 Q; X {' a# k) g$ x$ `9 A' Q: ]# ], Z
b2[jj] = vec2[jj];
+ s* X: a* t0 y. C( G ^ A9 H }/ N: c. p# K. Z, ?+ M
& X8 o1 b6 w+ h8 B- T: n$ l
//Method - 1 N=100000 247s
3 f& s$ C* t" j //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 J7 k5 W& U0 b! a) \
2 B) p/ L5 E2 ^8 A, n2 g //Method - 2 N=100000 237s
, E0 U+ O2 k7 H6 P6 v /*$ d+ }* @/ L# ^/ G' {/ x. i
for (int jj = 0; jj < N ; jj++)+ ]8 x! x4 t3 m# H# w* v
{
8 S# K! b$ u0 x3 G2 O fresult += vec1[jj] * vec2[jj];
5 e( t" r- A4 d2 L$ C. k } u2 K E9 F" G/ Z3 V
*/6 Y2 W7 O# ?2 T4 x
" Q7 R; \7 R" w! M- J9 }' y# y
//Method - 3 N=100000 204s
$ s9 ]/ Y, }1 y' g8 N /*
4 B% m0 I# w6 X c* D; S5 E for (int jj = 0; jj < N; jj++)
0 e& d/ u: O# O+ v {7 r ? `3 `5 l! @
fresult += b1[jj] * b2[jj];7 \* M0 t5 `1 i* d9 o/ b
}
% l! D" [; `9 K */& T* {! O' P2 [- E3 i0 T: J: N7 y8 x
]2 ?8 ]6 K& Z. v0 ~
//Method - 4 202s
/ F! a* S; d3 I) C# Y /*$ b% |. p3 O, f$ u+ P; `7 o
for (int jj = 0; jj < N; jj++)' A f$ e2 m) h0 }$ w( g$ w
{# B9 G+ |5 F* A# B, g! k
" e' b! [& X- O. C
}
% g! T6 |# |: h* w- R */0 y" m4 C _( i8 Y, @# M- n
//comment out all methods, N=100000 202s
/ w- B. A& }: P% {; w P; r }7 F2 I8 c N" u' p) T
8 L8 Z6 j% g& j1 @
delete []b1;
# {, _8 A: w1 w7 D0 f delete []b2;
. M. }* @0 q, c: f9 v3 S* ] |
|