TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
- J$ l5 W4 m& r% _- f/ z% `* J. e
理了理思路,重新做了一个测试。
, @6 x5 |4 b' }8 @" o做了两个 vector 和 两个 float *, 都长 100000
- r7 S+ t0 V8 h' f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 S, r8 L1 \ e J) y. g- p8 e
1 d) h0 b3 ]* L I( N- _( ?# v内循环试了4种方法,
- G; q1 R s t- F1. 直接调用 vector inner_product 247s
! l4 Q' A4 H& M* R L1 g9 A u2. vector 循环点乘累加 237s
) g1 H% L' D; x0 `8 D4 A4 {3. float * 循环点乘累加 204s2 d, M. U) f' `' ?# h+ D$ Q
4. 空循环 100000 次 202s5 T) V8 m1 F7 N1 D* U9 e- l
: }5 `8 B, W/ y1 f
不做内循环 200s
" z- {& U' V+ z k
' Z) V% s5 B+ W& P你昨天说的对,内循环本身占比是很小的,大头在其他处理。1 l6 b9 B! A" p, ~( r, T
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# B$ f6 `, o, v* H
" j$ P/ q# a. Y; U: C: V; @& u3 w
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
6 T3 b) W# Q6 Q
4 z. V X2 J2 ~1 {- C% [) t- n, [(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 b' |, u9 M& h) ?' W' A( B
* d! c( s! z7 r9 T: \/ q8 X std::vector < float > vec1(N);
; L9 t- ~0 E$ H: @ std::vector < float > vec2(N);2 O6 {2 w8 s9 h! T$ D5 X
float* b1 = new float[N];
0 `( _ e/ S" m6 e+ Y$ q1 b float* b2 = new float[N];3 a4 _# B% R% p+ }7 F! b+ \9 o; q
: v# R, L" `+ L
for (int j = 0; j < 6000; j++)
* |# {0 C e% X2 o* @ {
0 J5 R$ \, ~# f0 e7 G6 N) d: [ std::generate(vec1.begin(), vec1.end(), []() {4 j8 N3 v6 M8 P3 Z- M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 A/ n3 f- g* ^1 D/ ~8 z });8 Y- P% G4 t, W- C# }
# j' I+ X9 P6 g/ _' _
std::generate(vec2.begin(), vec2.end(), []() {
; \8 ?: a' U, C5 y9 h! k return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ k$ b. }6 M6 I0 q; ~, N5 E d! _
});9 T# ?/ _% ~1 q* h& t
' L' g0 u& s( E3 l
for (size_t jj = 0; jj < vec1.size(); jj++)1 I V: X e2 E% o" V9 @% \ W2 B
{9 l. e: Q3 F- z' ?
b1[jj] = vec1[jj];
+ h4 b6 J, Z1 q, ?2 t& k }* s. k7 }( T% F! `7 Y- y
. `% H5 e6 ~9 H! B- Z for (size_t jj = 0; jj < vec2.size(); jj++)
; b( y4 a3 R$ Q, x {2 e! z. q5 ?3 f( M
b2[jj] = vec2[jj];
. Y$ g1 y3 }- D }& G" P! h; t# m# i3 b
4 B3 O* Z; W( Z3 w% |( U
//Method - 1 N=100000 247s 2 J P! {$ e1 R& u
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& i# q# N: V- \* ~+ O# j: q
- R- B! Y( O& \% a! s9 P) g! ~! w8 _
//Method - 2 N=100000 237s
) c( @ e, {' T7 T3 w _6 L) @8 { /*# b; K0 h* F- C2 ]; I. a x$ x$ U
for (int jj = 0; jj < N ; jj++)1 L/ i9 X( R7 E9 \& X
{3 @/ i4 m# }. s7 }, }+ e5 }
fresult += vec1[jj] * vec2[jj];; O7 l: A1 H( q; m7 s$ ?9 F
}
% A$ G3 l+ {0 l' _ B! d */: d% s8 ^& V( c: Q7 Y' \
) Y6 |, ?3 p( B5 v* n7 B
//Method - 3 N=100000 204s" Z4 z g7 I$ \; k0 f9 U
/*
$ J4 U4 M7 a* X* i9 {* F, _8 |5 g for (int jj = 0; jj < N; jj++)
! v. c7 r* l8 s8 C6 i# @4 A5 ^& } {/ Z' N, j% t5 G% T M
fresult += b1[jj] * b2[jj];, o! L3 i" B5 I( |
}
4 R8 A8 c- y! S2 w) F6 ` */
6 v' ^/ {" M, N( t) a; {2 h! N
! D$ s/ R6 `1 W9 G V7 q" j9 n' X //Method - 4 202s1 S4 e! }9 |% n* B3 x( y
/*
; e' [1 W' Y T1 _" ~ for (int jj = 0; jj < N; jj++)
, Y, `( | o# t ^, ?9 u- O {" k b1 F- g. w7 P0 N$ h/ R! [/ k
& i9 N n3 X( P0 o
}9 q* D& g' V1 H8 ]2 `
*// G1 f. E1 w/ y( ~7 L5 w: b
//comment out all methods, N=100000 202s . _0 O0 Q/ C% n5 s6 j( K( E
}
1 A2 l6 _% l) N3 M. u# @6 _* [6 b, b' X% E
delete []b1;
7 L/ L. F; V) r2 r6 O delete []b2;
7 t4 D1 Y) h1 F* f/ F$ B9 D |
|