TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! b2 Q) g$ H( t# U( m' c* P3 s( @$ Y, }& M% T( F& I- B
理了理思路,重新做了一个测试。% `+ \6 i+ m7 w/ ]
做了两个 vector 和 两个 float *, 都长 1000006 O/ u& e3 \1 V
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 N' c3 x0 o/ Y( q5 n0 @: [7 K6 v
0 H2 ~6 K/ d$ e内循环试了4种方法,9 v# c1 V: A( N- H3 o
1. 直接调用 vector inner_product 247s
& r! a! B: B" t; l* u, I1 ~. c2. vector 循环点乘累加 237s
b. u+ ^) M; W% W+ l* W+ h2 v3. float * 循环点乘累加 204s9 J" x1 `8 Z' o4 h* r4 J4 E
4. 空循环 100000 次 202s
! d' M. ~3 u! f7 R# m1 k' d& x5 s
不做内循环 200s' p; P; p% x" z, l$ a
: g) _' i. g1 `. B- M s
你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 B6 |; [& p6 s& Q9 G" F' a, I
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 \3 p4 U+ B( Q! f7 J! y3 z7 X9 e2 t
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 m) L$ n, g8 ?7 B9 K: a
' s- ?+ i' \* d: g# m% L(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 A1 Y1 o8 y/ g5 k' ~4 y2 Y, j6 t' ^' {- b+ y% d$ I
std::vector < float > vec1(N);1 @6 v0 R$ K$ `% P; S) ~% m" N# k
std::vector < float > vec2(N);1 w, F" x4 H7 g" |% s$ q* @
float* b1 = new float[N];7 z) N0 S2 x! m' z
float* b2 = new float[N];
* f. b* [. o; U6 f% G5 ]: K2 U1 `; ?* n3 ^. j% Y( {
for (int j = 0; j < 6000; j++)
# j0 \6 a' k" i2 A- e {% A! L+ _: Q; ?3 a0 `
std::generate(vec1.begin(), vec1.end(), []() {3 @# p- P- O2 ^' u8 H
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
: E* X( s! m- _0 A m });
! B a) U+ ~; W! t0 R' H, y6 m2 l/ L G
std::generate(vec2.begin(), vec2.end(), []() {
* j; q3 _6 C+ w1 `4 U* c return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;/ E9 {2 F" W% l }/ w9 J
});
- _7 l* Z. k: M, ]9 `4 Y6 T/ `9 F" o( F6 N3 `
for (size_t jj = 0; jj < vec1.size(); jj++)" F* ~3 e; O s7 H! u' k. u0 X
{* b! x% m& H7 w
b1[jj] = vec1[jj];
( ~. d. F6 G0 Y) x: l" _- ^ }
' c% O( u$ d+ A% V K
6 a6 T, f+ o2 X3 @ for (size_t jj = 0; jj < vec2.size(); jj++)
1 a. u/ o3 J1 b {
8 d; I6 R [7 W1 O8 `( W8 M' ] b2[jj] = vec2[jj];
" a, J* B$ ~7 u9 C; t% } }& O$ o+ c" _4 d
5 }2 p9 L% v0 ]6 U. C* {" |' Y //Method - 1 N=100000 247s
, J) V& p* @: v9 u5 t/ o2 ^2 b //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0); H! Z8 p5 H9 M& e$ c% s
2 d0 S5 u9 k* z: ^: I //Method - 2 N=100000 237s7 c1 P+ i2 z: m$ j
/*
% v5 M+ R6 J: g1 D/ x( H0 e4 M- U for (int jj = 0; jj < N ; jj++)8 Y8 r v k! o: c2 r7 a5 ]
{. i1 G; _9 d+ N' N
fresult += vec1[jj] * vec2[jj];
/ N4 n! V6 f B9 Y. r }! e3 W2 c" c, O
*/& E& F: a9 |+ @% Q* c8 g! j7 i+ G
6 q- D* `' ?) A( g$ n! F5 O
//Method - 3 N=100000 204s
; h/ D+ i4 T/ ^; M% L, A0 C /*
' Y3 a, x7 T7 f$ p' X/ ^; } for (int jj = 0; jj < N; jj++)
8 a& N! w* V, O; t4 Q+ V6 z {+ W0 `+ l2 ?; s. ^
fresult += b1[jj] * b2[jj];& p6 y; V1 W+ X+ V. U7 S
}5 J) r6 j1 I8 a' l8 Z) Q
*/
O% R4 x$ U! ?( C
( @4 }( T( o% p //Method - 4 202s
' [; R. c! v Q4 K4 Y /*
' ]+ x2 }* q5 g7 A/ ~ for (int jj = 0; jj < N; jj++)
C# M! A' {; U' z N! Q0 V {) u1 D" T6 @1 V' a2 [: {! E
; H0 [+ L/ r8 t: |/ C9 w3 k }6 ?6 k! x" c$ p% ?/ Z# g
*/
9 C0 @6 l% t( C! m. i //comment out all methods, N=100000 202s
) F! Y7 N3 m. ?( \; m: V* k& h2 T }
' t# A1 G+ M, ?5 N% I2 X- @. @0 z5 X: M
delete []b1;
* R& p# u" g& N delete []b2; ) b R$ |" v1 H' ^: P3 W
|
|