TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 & L" M; c2 `- b k6 z+ i/ E
5 B! T/ [& }( C, L) ?1 J: I* ]理了理思路,重新做了一个测试。
+ z8 P5 S$ d3 H7 P7 G6 E做了两个 vector 和 两个 float *, 都长 100000
& w0 W+ P" C, ]& J外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! x( V! y K' b! x9 b: d) F D2 l& G& Z/ k+ K
内循环试了4种方法,
4 v: b& P' v& O, O3 r1 u1. 直接调用 vector inner_product 247s & R) }4 r, _! j3 [8 l* Y+ I
2. vector 循环点乘累加 237s
5 H3 E" B9 n; {2 ?" ?. I3. float * 循环点乘累加 204s
6 G( z- |( z3 E5 G! `1 z/ C4. 空循环 100000 次 202s, \- B& W- q4 h8 Q4 z. X. t
% F D- ~; t! F. g$ {/ K
不做内循环 200s/ C' Q% M7 U& R. O* F+ k1 n5 ]
" f7 l. J7 H2 Z0 f" M
你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ g% n/ J2 O- r
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
* Q; I) l" _1 u8 U' d. w7 {# u* {5 t `+ A' Z& L8 P$ `
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" e! @$ h) h! v' C8 ~
! S# |7 V8 z j(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! N6 t7 U( {% [: Y x* c& N* a' [
7 H$ }! r6 T4 M) o$ B: b! i# L std::vector < float > vec1(N);9 p! F9 V3 o1 R5 u
std::vector < float > vec2(N);
$ O3 _' E% J4 j0 {) Q0 V& y' } float* b1 = new float[N];
4 V d* P8 Y2 W( M0 h! {" p float* b2 = new float[N];
2 Z6 E) y% ?1 K( j8 B8 ~& F
7 F! @8 j5 \ I5 y7 H for (int j = 0; j < 6000; j++); U, ]2 F2 s& B w! x+ C! p
{
% h! ?8 A# m6 L" S8 W std::generate(vec1.begin(), vec1.end(), []() {
4 G7 G2 E( n4 o return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' }, [/ S; \9 q
});( g4 W# ?' `- Y; m5 e
: a) D. o/ j" ] std::generate(vec2.begin(), vec2.end(), []() {
7 Q1 ^( L4 j6 G8 Q/ u; S) Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 F, g! s1 P4 G! J3 n
});5 S" A# d: P8 w. z' Z; D
2 J# O5 Y+ l( [6 F4 h; R" S
for (size_t jj = 0; jj < vec1.size(); jj++)% J5 A) w/ g! r* v4 \
{
; w* q6 p- e' t8 F6 e b1[jj] = vec1[jj];
" s/ G0 {) P4 [9 P+ o" G }
w& Q' c6 } R3 P! I& M! `) M- f1 e) [
for (size_t jj = 0; jj < vec2.size(); jj++)
6 \; ^6 i8 r* g0 T- t {2 h4 W% p6 I& o9 Q* s' G
b2[jj] = vec2[jj];: M' o0 N _9 X8 s( p" u# W
}, q) t) p5 Z- ^% ~. @
. V7 A) V* P+ B6 H //Method - 1 N=100000 247s
) Y, P: y! C4 J' R% p* B% ] //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0); G5 z* [7 s: y2 j+ x4 Y
- T2 Q! I0 V5 X8 _4 d* f/ |! R9 N2 l
//Method - 2 N=100000 237s
7 m! K" k) w2 R) x2 o( P% u /*
' S) Z7 `2 n, Q1 O for (int jj = 0; jj < N ; jj++)
: {) U% O' E; \8 \" d {
. S2 ^$ M6 g) A fresult += vec1[jj] * vec2[jj];: Y: H2 o/ l: t9 z. M$ d! A) F' L
}# d2 k8 R) U$ \" m; Q4 C: B7 A
*/" m7 r, g/ r! {3 U$ z9 M' {) v
8 e; A! p, g& _ //Method - 3 N=100000 204s
% |* @) i' Y% x' |7 ` /*
/ s# d; N3 k- _ for (int jj = 0; jj < N; jj++)0 C# a& ]4 n' B$ D0 n+ @2 F
{; o% B* R$ k' W/ a2 E7 j# v K
fresult += b1[jj] * b2[jj];
+ F( X _( x. X) ^5 B! q }. f6 T" F7 s: G
*/
5 @8 R8 s. z; y) }- T; H; ?& \/ T ^1 o# M. B
//Method - 4 202s
, Z1 G0 s5 w/ p1 Q; X /*
. n/ ]8 T) b0 f0 @! D! g for (int jj = 0; jj < N; jj++)
3 ~& e y& r0 ?9 c5 t' B3 i5 j {
. p+ N* P7 }: b8 B( I) I- B : `! l/ W0 a% X+ M4 C) p* I( v
}( T4 D! j8 E$ H3 z1 k Z
*/
' w* V7 Q1 `! V& C0 i+ Q9 D% ? //comment out all methods, N=100000 202s 4 J2 _" f0 V4 L; X
}
. m' c( v' Y* {9 o% @8 P
~. P1 a4 Q1 j/ i7 W$ V U delete []b1;4 ] k- }: Y+ V X" F4 ]
delete []b2;
6 L9 ~# V3 G1 [* c |
|