TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 , M2 U/ N) K0 G
; q& Z# @( A0 ~0 s4 N }$ ?5 c理了理思路,重新做了一个测试。
, M( I& X5 U8 n3 T( H4 F, h# H做了两个 vector 和 两个 float *, 都长 100000! v/ C; n' @# o6 a3 b0 e
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
2 \7 K4 l, g% E1 B! t6 q2 F- m. l' U6 X' p
内循环试了4种方法,
2 j! L) A u5 [. R1. 直接调用 vector inner_product 247s
& [ x9 f* b! R5 }( {! k1 C; U2. vector 循环点乘累加 237s) I* g2 E3 b+ u2 N( t1 R# p+ g
3. float * 循环点乘累加 204s+ ]# [7 d6 z; ~$ I7 ^8 a
4. 空循环 100000 次 202s/ [+ ]: g) v: s0 K
! W* p# `* b& o( H4 l. w+ h
不做内循环 200s
3 K6 k% I, B( ]+ w. V# }1 R8 a, b g3 Q8 E" f6 |3 O6 v8 p
你昨天说的对,内循环本身占比是很小的,大头在其他处理。% P( o; h! `1 E, Y1 a$ y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, ]6 I- {0 h$ g9 _4 w6 ^
; H2 O8 t! n- c# Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 v! o6 M% R3 f R7 m' b% y- Q" K* ]: X, e# Z
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- N5 Y! G4 o* y: S7 M+ m3 |
: j9 B2 o: U4 R4 o. P& ^8 K std::vector < float > vec1(N);9 t. k- L- v; U, F& [1 W5 H
std::vector < float > vec2(N);
( i. r/ l8 I7 u* V$ `" F float* b1 = new float[N];6 q+ j. i% N; |# c! j) }
float* b2 = new float[N];
, K' A; ?: l4 l. g
. X. A3 f, \. y6 K for (int j = 0; j < 6000; j++)
& g. Y i( Y$ K! S { E9 B; n6 l1 s: i: Z- [- p6 q
std::generate(vec1.begin(), vec1.end(), []() {0 X. D* b, `7 f; {: q2 d& y. F
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. s* {$ v# u" Z& ? });, P4 j! H' }: }6 b, W7 p
2 C+ y1 R9 c" A* s
std::generate(vec2.begin(), vec2.end(), []() {
! s% u/ E& l6 |1 d2 x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; Q- q! W+ M; m' z" k
});
6 m. s5 D; R' x# L. u
5 B1 ], z9 u( _0 n% l for (size_t jj = 0; jj < vec1.size(); jj++)
; j$ V7 T. b: z3 a {
; L- C% O- z/ d) q b1[jj] = vec1[jj];3 ^) Y1 S% R9 L6 Q4 m+ e
}$ }& L0 [8 I3 F5 O
/ T8 v7 Z( d0 k: V* i: m for (size_t jj = 0; jj < vec2.size(); jj++)
9 }1 n( E: H2 y# F1 h {
x% E6 ~; d3 K+ N9 T k b2[jj] = vec2[jj];5 _5 o6 g8 R9 w+ q
}
! X6 l) v2 G. O! e) ~9 @; C2 f d; |( v- d. b0 C
//Method - 1 N=100000 247s 5 e( _8 e( P3 w! p( c
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);9 `8 u; Z+ G! x/ D
* s! Y9 e, E$ S$ l: A; }
//Method - 2 N=100000 237s
9 m1 {% W5 d9 o ?9 q /*
/ w) {) e. i+ B4 \2 j; i2 f4 ~! J for (int jj = 0; jj < N ; jj++)
. q/ V) {+ U( D1 H u+ Y( I6 ^% N O1 U {; f9 S' v% o; ]; E( n2 r" J5 \! i3 ~
fresult += vec1[jj] * vec2[jj];
) d$ _- z, d1 W1 g% q4 g }
) K, M7 X& R& r9 p) N7 e8 k3 B */9 p: u4 Y% T: I, q* v& T
) B8 t2 _' G4 K( ~
//Method - 3 N=100000 204s( ~2 ]2 O! X, H2 u9 e' t6 r
/*
( c# D i7 R- z1 C for (int jj = 0; jj < N; jj++)8 A/ F9 C! n8 H# ? e! @4 y
{
" O- ]3 v* g# ]: O( M fresult += b1[jj] * b2[jj];: G+ }! c- `$ d, b! B1 r, |' d
}4 \$ u- l" M3 N; L- I
*/
; y/ I3 M; J; [2 o
, E3 U1 L0 i0 k& ? //Method - 4 202s
6 w7 ]+ j/ w2 [, i /*' @: k6 ^+ T$ t
for (int jj = 0; jj < N; jj++)
6 `9 X% R5 z2 H# o N: H {
' h! D# N8 a8 i5 ^2 W 0 n6 E6 W$ d6 f7 n+ Q; T9 ]# m4 u
}
2 |& ~7 B8 J3 r8 j7 s2 H( J */% Y# Y i8 d0 W$ e
//comment out all methods, N=100000 202s
: x3 j7 x# x2 a: Y! { }
- M+ h- {. {( k0 P
4 R* h, i) r0 i6 e, u7 ^9 l delete []b1;
, L2 B& @! o2 z& Q delete []b2;
& Z9 H/ k+ v- K! Y/ T |
|