TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! G( G. p. Z1 s8 i; p4 T
5 P1 h' j8 F2 c4 ^8 f9 }3 W5 g理了理思路,重新做了一个测试。1 K2 s- o3 [8 \1 K# \6 d( n
做了两个 vector 和 两个 float *, 都长 100000
2 z0 D, h# ~( ]& o. F$ E( @外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache. r( R* i0 W$ m
; h9 N7 O$ Z3 `! m5 M内循环试了4种方法,. L+ K/ n" b [3 Z# d' H$ x" ?. ~
1. 直接调用 vector inner_product 247s
# d: s6 v2 }# t; J% h, ?2. vector 循环点乘累加 237s# i E4 s* m: ?5 R7 d U: v9 W! @
3. float * 循环点乘累加 204s
# y/ D+ o0 F2 C3 f4. 空循环 100000 次 202s
* t( [& u# E3 U0 {' O" ]) \# R1 j; W" z
不做内循环 200s
+ M) n; V9 r. j1 E
2 q6 R9 Z6 N, ?& d }: Y7 U你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 ?8 i; z- I. f# ]% Z1 g另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
! ~2 X9 M* L. e
' H: S7 q- `* g* h9 C- z7 k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! ?0 r) F+ g8 V+ h" t) _) J
* W( X) a: d9 R% Y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 Y+ e( C; ]/ m7 R: v
( D0 T( ~( N! I b/ \ std::vector < float > vec1(N);6 h W; q* S9 x! V
std::vector < float > vec2(N);; i# H I) _- |
float* b1 = new float[N];
) H; H! [ Z, b x& S float* b2 = new float[N];% H* ?9 u ]3 z0 D O9 [
* k2 i* Q; N% c' s for (int j = 0; j < 6000; j++)
3 ~( @0 D' @+ j& B; _0 I# { {9 P I: f, T$ N( B: q7 C5 j& ?
std::generate(vec1.begin(), vec1.end(), []() {
B1 D, r! g1 k' y2 x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; _* V% M' |4 W& D
});
, G- ?# P0 z2 Y( {! ]; z6 g& z) w- I6 V# b
std::generate(vec2.begin(), vec2.end(), []() {* Y) R$ N. M& y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
4 ?5 G& i0 P \$ v });
) w% v/ z7 E- \3 X4 V) g! H
5 n7 P, b. z+ ~" F3 J9 w' G for (size_t jj = 0; jj < vec1.size(); jj++)% I! z7 r% `. k/ ~
{
; h$ o1 h8 f) A! i1 H b1[jj] = vec1[jj];
5 i' s. {- Q4 X. l4 J5 B }; F6 ~+ Y8 U# L( K5 `6 k
; f) S. L9 T* M6 e0 Q, V7 X- i for (size_t jj = 0; jj < vec2.size(); jj++)
. S( }" @" f8 Q) R( p# e$ U m {
7 {) s9 ]& e1 R& H b2[jj] = vec2[jj];
. V7 x, c0 x. H3 I' M }
4 W! m0 ^5 q& d
; ?# B8 i% A- }3 i, K5 Z //Method - 1 N=100000 247s
2 Q- M& G; r% E5 O" C- ~$ M //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 \& [. G& \: I/ \- B% k! m
0 C0 e9 r, C" U+ R //Method - 2 N=100000 237s
3 W! W( ~+ ]4 K1 x4 r5 S" [ /*
! W% B1 `* a, e: g/ q5 v for (int jj = 0; jj < N ; jj++)
' m' r. e i2 Z9 Q& S/ e {
, V; W9 O! p4 @& I$ O& k fresult += vec1[jj] * vec2[jj];6 ^7 U- G( s* I) P# D
}
% `) D9 V& h7 `+ e% P) v C */
, D: M& e" ~ c8 \ N7 e0 {3 `4 C3 ^
. \+ P) f9 i2 R7 {0 B$ Z //Method - 3 N=100000 204s' w9 F0 [! v( \
/* e- \* o; ?0 b6 s- F! R( @: t1 N
for (int jj = 0; jj < N; jj++)
* ~! E! @ L7 V' s' s {9 W* T) N1 V& j2 x" K* L, ^0 W+ M
fresult += b1[jj] * b2[jj];7 p2 l: L$ f- [- J6 N% ]1 \
}
8 j0 \; s; Q( Y4 G" ^, c9 h! i */' b( F2 K0 c$ a" R/ y" y2 X0 U: b
3 B3 ]$ J6 s$ y9 W8 e5 {' C
//Method - 4 202s
" |# _! w7 [) n /*
) m1 q. ~1 d. F' ~# X/ H" s# w for (int jj = 0; jj < N; jj++)4 l) `3 m" o; \% o7 h9 @, n g
{
! Y0 L" Q8 P4 L% a7 C . o% |7 l* M' G) v3 @/ N" }
}
: ] r% B+ b& k8 F6 _& O */. o% O& ], ]5 E5 N0 j8 |5 t9 Q8 t
//comment out all methods, N=100000 202s
9 J) c9 v) B. ] }& a: |6 x X: v W
9 B, P2 R- U, P/ S' X' N delete []b1;- E x1 |: P* B0 E% R
delete []b2;
% O" I0 T9 B) V |
|