TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 }6 T6 D: y+ B3 D$ n$ f, V W! F& N$ k* r F, p
理了理思路,重新做了一个测试。, H& h* I: [4 O9 y4 @
做了两个 vector 和 两个 float *, 都长 100000/ v6 t2 }" z: J X
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 X# ]4 N5 Z |# N1 [3 ^1 P4 X% A% {
内循环试了4种方法,
3 q) T7 h3 ~1 `, ~' A' P& k1. 直接调用 vector inner_product 247s
4 u$ @% F9 h. U- g/ Z) ~' A2. vector 循环点乘累加 237s3 X5 ]: @- v) S7 ~7 C+ Y
3. float * 循环点乘累加 204s3 m* B! d+ ~6 _
4. 空循环 100000 次 202s
+ T3 Z& m0 i; ~( n X' U
- r# E, O) M/ |" i) a( f# P2 h不做内循环 200s
. ], y6 a. k; E8 J2 p$ _3 K8 j9 C# K( G) s, w1 n( `9 z
你昨天说的对,内循环本身占比是很小的,大头在其他处理。' c! m3 |* [ Y8 f3 Z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 v) q* v- @6 G8 J: O' T* l" G% t4 c9 i5 |5 Q1 g% j3 T
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- ^/ l6 u& f4 G/ x
/ f1 W! D8 s: G(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL) v. N7 J: `: D1 s: Q( s1 P
+ [' B; j# W- z1 t9 B std::vector < float > vec1(N);
& i& S; }1 L6 X6 I$ ]" R% f0 \$ i std::vector < float > vec2(N);
$ D4 U/ U' p2 [, g, f0 C8 i# w float* b1 = new float[N];5 t; I9 R3 N. e, r# h% k
float* b2 = new float[N];
3 A% p2 W4 u, f# ~
- z5 R" f8 Z9 Q+ |! v. |" ^, } for (int j = 0; j < 6000; j++)1 Z/ W1 P' p. Y8 Q0 \8 t
{
* z7 W: X8 c% H% c$ D# j std::generate(vec1.begin(), vec1.end(), []() {
; s- {: C( `7 R L/ A1 T1 _ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 B& q/ U6 ?2 i5 m9 P
});7 x# Z1 E) }2 e# ]
. f3 m0 N4 o# t1 y$ c- S8 ~ std::generate(vec2.begin(), vec2.end(), []() {& a& V; j/ X: |8 Q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
: S- y$ K. l% S" ?6 U. o9 T& O });
& R% L# q! D: h& Z: [& |) S9 \, o+ F9 {1 x+ B: }
for (size_t jj = 0; jj < vec1.size(); jj++)
, B! x8 N# X( |* J" Q4 C {* `+ \# k5 n8 M
b1[jj] = vec1[jj];
& w7 K6 F/ Q% H1 N+ w# f6 |7 I }
. Y% E, E! M6 ^% S! C
1 B z4 }/ X# H- k$ D for (size_t jj = 0; jj < vec2.size(); jj++)
; v% ?3 U' P1 X {/ N% d5 G4 C4 @. x
b2[jj] = vec2[jj];" X. J7 T. b& N' _- n$ t7 J4 G
}/ n! s" f) D; `6 g- g
, v N6 o$ Q3 @5 t; b
//Method - 1 N=100000 247s
_- ^9 L" R R4 S" P i+ M //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- H$ J$ p& w6 l
) f1 N$ H- C C; A6 N5 K- \
//Method - 2 N=100000 237s
% h) a7 ]4 q& }( e" @# c /*% U |/ a* ?; e0 A5 z
for (int jj = 0; jj < N ; jj++)
& I$ U4 @* I* \) Z$ u {
+ ]2 E) `2 }4 D: s, [8 D8 N fresult += vec1[jj] * vec2[jj];+ T6 u% F# T: ^9 Q" v' z5 M: G6 J
}! s2 ~/ X7 e4 _ ?3 a' L$ U
*/# T$ a& Y {7 {; S
! m6 B8 ]) _ Z/ e
//Method - 3 N=100000 204s
4 B# `% H M9 o) y6 s /*. `" o8 }. n0 Q, O0 P
for (int jj = 0; jj < N; jj++)
; w: k" w2 M& }% ]1 Z8 @ {" O1 ^, n5 }1 D2 U( S
fresult += b1[jj] * b2[jj];
" B$ X: M7 u( n7 k. u$ K }* y- u# f7 W/ L/ |
*/
% M# X9 d' v" f- L- {+ F5 M: U7 j$ q) q J+ n) K! R/ Q
//Method - 4 202s
% D& b" V w$ J# m" b /*
9 F& K, V& P# [4 G7 z$ k) p for (int jj = 0; jj < N; jj++), E! y1 J ^' F- L; \7 d
{
5 p) r* q1 f* d( A4 b4 ~ : U7 B; C. l, A' f1 ?
}# g9 L5 N$ l' ]+ B$ G
*/7 {, O" b; |' h1 K
//comment out all methods, N=100000 202s
" T. i. P# V' C9 R }
% _" d* \) |$ p
. f# j1 l4 U9 B+ O6 T* w delete []b1;
' a/ ]$ z* \! S delete []b2; 3 J8 u$ U' ^3 w( q6 d$ q
|
|