TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ Z( j) b' `# \. v3 k% }3 V8 c0 ?0 q0 v+ o5 a
理了理思路,重新做了一个测试。, f' ?1 I/ W" q
做了两个 vector 和 两个 float *, 都长 1000000 l1 d/ L; x, V8 T" D) u1 |
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
O0 S( N" i2 y0 N
1 r8 ?- T; a; M: _( k内循环试了4种方法,! ]8 v! `* B& ^9 {$ Z
1. 直接调用 vector inner_product 247s
+ j" {. H) ?* `2. vector 循环点乘累加 237s
- ]) c! Q7 g$ P) X3. float * 循环点乘累加 204s0 ]8 l2 { D1 \( Z, b1 g( t
4. 空循环 100000 次 202s
6 }9 F9 f8 [& B# n' K
6 Z# m7 _- [( H9 L不做内循环 200s
5 m* ~3 G+ \- P7 Q: F- S6 n( h0 b3 U% \/ l, P X2 y# Q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
5 t( H. F5 {. G7 Q6 [9 D2 C) ~另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( q1 L( W& Z ?/ ]6 ^/ b
4 k5 p% G1 J8 I8 X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 R. k4 Z9 D& }7 Y+ {2 M- U9 |4 |8 P9 C A" e$ d; D
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)9 o* Z; @! q: z2 U, N, V0 O* U
4 v9 ^* }5 @! O; e std::vector < float > vec1(N);
* X8 T) v t4 p5 e2 ^; `: D' R5 J std::vector < float > vec2(N);
0 f% p- ]- m+ S. _1 m% \1 s float* b1 = new float[N];% R- g) m) }9 a& V( p
float* b2 = new float[N];1 V3 n7 a7 F& G0 s }2 R$ \5 j
8 n" A, R5 Z! h6 c) q& s r
for (int j = 0; j < 6000; j++)3 z6 Q8 }0 v9 e1 w1 M2 ?; | R) t0 ]
{& `8 W0 o; m: ~7 s/ [" Q
std::generate(vec1.begin(), vec1.end(), []() {
y; ?/ X7 V3 ?( X, s/ m# k return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 y9 |, k0 F9 {& {- @, n
});
! I6 j: e6 H4 A4 d) d- }, F1 @. Y; b
3 S$ \1 w2 r6 z8 D+ o# N( d2 r std::generate(vec2.begin(), vec2.end(), []() {2 X) x) o8 p; o) o; G
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 Q0 r8 {3 R+ O; G: b+ Z });, C) s: o$ ^' f- S
4 k0 h: ?/ N3 {3 r8 U for (size_t jj = 0; jj < vec1.size(); jj++). ?% @$ {4 Z3 p) S2 y
{
, y$ u' a; P' N6 D( R8 e+ s T) | b1[jj] = vec1[jj];
3 W. O, M; Q; d! |; [5 { }- z7 v9 C- q: R$ Z9 c) D" D
$ V, J3 @! ]2 o! r
for (size_t jj = 0; jj < vec2.size(); jj++)5 b- t5 i; O5 p5 j: |
{
9 ?" s( P# F: O* K" { Q2 L( T% E b2[jj] = vec2[jj];! ]5 L4 E L5 A L2 b+ T
}
: u9 T# Z- Z, N9 C2 a3 ?/ p8 c$ f/ D4 _4 k# h# `
//Method - 1 N=100000 247s - {0 y: Q- O1 A
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
; U- ~: P- I) m c6 O" L - C7 ]4 {; R% @9 f3 F8 u
//Method - 2 N=100000 237s
% N5 v! [/ w# f+ C R/ f- @5 h /* f; e2 `, r% }- R* S: i
for (int jj = 0; jj < N ; jj++)
& U* @+ M I7 H* C, W; } {2 P' X" g; T# `; w1 P! M
fresult += vec1[jj] * vec2[jj];
0 Y- T/ D8 Y& Z9 i* h8 h }
% B' N; |( B" [' a' ? */) n1 R6 J6 t2 _( L s& ^2 ]# O- ?
3 n( X6 Y# `! Y0 o' N1 H //Method - 3 N=100000 204s
; O' e$ I5 z0 a, f, K7 B+ D* Q /*0 @( H: O5 K4 _% ]5 p- W9 U
for (int jj = 0; jj < N; jj++)% V& Z9 x+ Y! i+ X& Y# P5 V
{
2 J$ ^2 X& O! W0 i6 P8 {- R fresult += b1[jj] * b2[jj];! p4 D$ c4 W i: o8 c/ p) J! f
}% A; |% g: z3 h4 C4 r$ I
*/
+ l4 D9 U5 A; z4 m" w/ [
2 f- r a0 ]! ~9 P' [/ ~! ^/ o //Method - 4 202s
' `0 v, P8 D3 E. \+ G3 S' U /*7 R2 [1 A+ t1 H2 g9 c
for (int jj = 0; jj < N; jj++), G' A* y' `- s% [
{
3 F& Z! e$ c; b) @4 t! l 5 g" C% T7 \, {# \8 ?! M; U/ Z
}5 y0 u+ k/ O% N- d j2 C! y/ z
*/5 k8 _6 C1 \" W' T: g) x0 q
//comment out all methods, N=100000 202s : \6 [' w V% H* w
}" f9 ^, b' T/ F5 o
# _9 `, |8 N) o# j5 U! G1 R, a6 O7 A
delete []b1;
: s. O: c4 P$ Y! A delete []b2;
# {4 {8 ~2 v4 x3 F |
|