TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 . L$ R: N$ ] c0 q$ n8 Z2 ^
8 x3 [9 ?+ {; U' J理了理思路,重新做了一个测试。
# ~# E" K) w3 n2 G' ?做了两个 vector 和 两个 float *, 都长 100000
# n6 z+ G9 Y2 L$ U# i, f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.1 G& I7 f; L! C( z- N2 J. O
3 U9 @8 e o9 b& b
内循环试了4种方法,
j! U* u5 I6 D' \& E8 J" ^1. 直接调用 vector inner_product 247s 2 V" i! L4 q- K Q
2. vector 循环点乘累加 237s U2 Z/ O {6 A- u9 ?* o, \
3. float * 循环点乘累加 204s
( ~! F! C7 q) ~1 o d: Y$ u4. 空循环 100000 次 202s1 H% w0 I( s2 }( s# i: j
- r8 F/ M; R1 K
不做内循环 200s; `- {6 O. [, Q0 b+ G
2 ^+ t) g. u7 z6 Q/ A) f
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
M3 d+ s/ t4 F1 M1 C9 Q0 e另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% z7 x3 u0 l4 c4 y5 q
$ C7 Q+ o6 ^0 t7 I! \3 V- K
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
/ v8 M) u& D6 N$ ]6 A; \
# }9 J6 f- t7 B5 R(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; c1 p5 p: h$ Q! b" e- P, f( x/ ~+ c) u
std::vector < float > vec1(N);
/ D2 Y' `0 q1 K. k. z, l$ Y1 V std::vector < float > vec2(N);/ n# a: i0 ^3 Y
float* b1 = new float[N];/ M# d2 _0 \/ z/ u& l3 E9 N
float* b2 = new float[N];
+ k& p- T2 e% _+ I) n e% D: @9 g- f' T8 Y& z* N* X! V% i. o3 v' Q
for (int j = 0; j < 6000; j++)
: U. F8 l4 l3 J0 F. A {
- T$ D+ u X B std::generate(vec1.begin(), vec1.end(), []() {
/ B# S$ x- c+ F6 e/ x! R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 X( ]0 g+ ^9 r
});
1 u& @3 h- G2 P! b* k6 x$ S6 Z4 i4 t3 V; [# Y9 v+ n }( j- i; D7 A
std::generate(vec2.begin(), vec2.end(), []() {( h+ O7 ~+ _ ~ e$ J5 E' M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
: T1 x+ l9 h+ H8 T4 ^ });$ x9 p- `9 ^2 w+ K5 _
% d% X0 R4 K5 y5 B4 T- m& A( J
for (size_t jj = 0; jj < vec1.size(); jj++)
& p9 M, t/ p2 k5 E2 F& z { ]( Z8 q, F" a8 e( A3 I6 Z: c
b1[jj] = vec1[jj];" ? Q, m- M8 c% h) m3 \% B
}
- p4 M5 l; h; y4 ~- ~, o/ n* J9 B
0 n% }) F+ @9 z. M for (size_t jj = 0; jj < vec2.size(); jj++)3 X% y* Q( `/ `; L S; v+ V# i4 ^
{
9 F4 ~% z; N: {: o) T4 p* F b2[jj] = vec2[jj];
! M0 |9 ]3 D2 V" s }
* w% D. l+ u) ?3 {! G# t
: K$ L5 R1 Q, _( D. X) V //Method - 1 N=100000 247s
* N) L; N1 D- Y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 J3 C$ H2 u1 t0 T: S5 f " b8 \! O. g" K' K/ s
//Method - 2 N=100000 237s/ p2 b% {* b4 |- G2 f8 h
/*
) Z( }+ Q0 I4 p% o3 q for (int jj = 0; jj < N ; jj++)& G4 C, C4 g6 O- q M0 p
{
( O* P, A. L9 I5 |2 V fresult += vec1[jj] * vec2[jj];& M6 Z0 d6 c$ c3 K, T9 b
} w) g& e x5 p" \3 `9 }' T
*/1 c: Y; T7 O0 K0 k% ~6 L2 G
! H8 m% r$ h. ?6 z) F$ y9 y
//Method - 3 N=100000 204s
/ V: J; V' K+ d2 y" Z% K /*
8 ^6 U' H3 F6 Z5 m1 }3 g6 @9 F* ^ for (int jj = 0; jj < N; jj++)
: o) ~& e/ ^ K3 b) g {' W9 W% R: W3 U: {. R
fresult += b1[jj] * b2[jj];! j- f# @) @$ ~5 a
}
) E* e1 d& M( G7 ` */7 F- D: j! q0 l# t3 l1 E+ ]
8 i7 a- t2 P( [/ B7 A8 i5 B6 I f
//Method - 4 202s! j1 F3 T9 u4 _# ^/ M! [, K
/*' r& n* F3 w+ _1 B& {
for (int jj = 0; jj < N; jj++)1 W6 u' e, [5 Z; c9 {
{
6 b3 Z) J8 l3 I5 ?$ n
' |: V+ C$ |! o9 Z* | }
, G: j) u* X" h1 T. D& K/ u */
+ j' e6 i% \$ K+ [% O //comment out all methods, N=100000 202s
1 K! S, {0 `7 i% V/ f: n& U3 R6 \. a }
/ U0 J7 A7 M9 s9 v
0 b- B3 I: B- E1 {! b2 b2 n* c5 ^4 F delete []b1;: g$ x) t, A2 A7 l
delete []b2;
( T6 @% K: _7 b7 W% F' }: E |
|