TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
$ q9 e9 n5 s p! r* F5 k3 k b+ t% A7 d/ ?
理了理思路,重新做了一个测试。
& \! A$ [1 H* L* o" |做了两个 vector 和 两个 float *, 都长 100000# h3 J2 B/ t& Y' r: A
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 a- g9 P. q2 I
5 c: _8 l3 C/ S( D/ ?* \2 M内循环试了4种方法,
4 h& X I5 l- Q$ o: V3 G9 X% U/ T1. 直接调用 vector inner_product 247s
0 \/ {8 W# p( D, T2. vector 循环点乘累加 237s
}) a8 |% B' Y0 b' }) g. U4 k3. float * 循环点乘累加 204s. F0 K+ y2 ?! T4 D* U0 h* @5 {
4. 空循环 100000 次 202s7 j/ \* ] b5 B0 @ R
) |: }3 e/ f5 k, ` Q5 d; h
不做内循环 200s
! C; E. F9 F$ t' _& L8 H% q6 J' }8 f# e- L
你昨天说的对,内循环本身占比是很小的,大头在其他处理。8 f4 o c8 c! u( \& ~6 s
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
* w' F! E( R/ J- T. J/ L4 O9 ?* y4 r4 l) _
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( L- S9 k- @$ c- @
( F3 M: r" l) C/ g
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)4 g; ~- w* X& \9 Y& g1 C7 y6 `
& M' r" m8 o% S% h' Z
std::vector < float > vec1(N);
& y& x$ v. A/ f2 I% |. f std::vector < float > vec2(N);$ o- S+ E8 k5 Q! c, t
float* b1 = new float[N];
: n# n' s& l y y0 P. _ float* b2 = new float[N];. l& H' k: I" j: P+ D1 H
# J: `" `7 Q8 W( G3 D3 _ T for (int j = 0; j < 6000; j++)% B7 h4 @3 c0 @6 {. N, [: w
{
?6 F4 M) O- C" C6 |5 {3 p9 O5 f; ] std::generate(vec1.begin(), vec1.end(), []() {
$ s# ?* ~8 _! j: {4 l) E return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
* m$ T* ^8 `+ G. D; j+ v });
8 D4 O- x( z7 F. o/ c2 B7 z' a/ y# J# W6 Z* i/ ^: X0 J9 t4 ?3 c
std::generate(vec2.begin(), vec2.end(), []() {
g: v, s: j4 ~% y) o8 y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) t/ @, z8 M* G$ f( t2 C
});' K( |7 g: p" j' m9 V
4 b# W" h- @. F for (size_t jj = 0; jj < vec1.size(); jj++)
; E8 D0 c. \6 T5 M% p; o {
+ a2 G! W4 b3 m, p! @' O b1[jj] = vec1[jj];
0 h( l) v' Z# N y2 _4 |$ K }+ f: U5 Y. t, T1 m# H7 b+ H' h
, ^3 P( j* Q* p; W, f
for (size_t jj = 0; jj < vec2.size(); jj++) C* ]% M% x/ L0 \
{/ b# W1 ~. [# y! {3 r- s
b2[jj] = vec2[jj];9 Y! Q/ ` g3 `( G7 j: q4 \
}; K7 ?- ~9 M/ s! R3 K s+ A2 g; ?" A
3 u9 |1 N/ d s; G
//Method - 1 N=100000 247s 0 ?% P g1 u: N; |* V5 H7 S. N
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 C {& Y% s. \; y
* A* d% i# D$ a5 ?' e9 i //Method - 2 N=100000 237s. J2 g, e7 k3 A
/*+ I3 n9 R, V" M
for (int jj = 0; jj < N ; jj++)4 r3 [+ W0 I F
{: H9 A( k6 }- J2 P) q& T( j
fresult += vec1[jj] * vec2[jj]; q5 i3 b$ W5 Z0 Y% k/ B2 m, W
}6 _2 G5 u$ E7 E
*/
1 K5 |8 J, e$ l. @9 L
, F3 Z1 d2 Q# L3 z //Method - 3 N=100000 204s
7 z# f! Q8 Q- q* Y /*
& R, a: r2 B* T% C; x, z8 L for (int jj = 0; jj < N; jj++)
4 _+ m# s! l% t. b, t+ [. ~ {
7 k! s' i7 @, U3 p& P1 s' `) Y4 g5 K fresult += b1[jj] * b2[jj];
% r& X( \/ s- ? }
. @' X" Y9 v1 v. H1 J */6 ?( ^( T; m/ h' K' j
- X6 `% I; O S, C3 r% r7 u5 }" @ //Method - 4 202s
, ?/ e) ]( B% n* c /*
+ {7 l {2 A! p- E1 s$ ~6 H for (int jj = 0; jj < N; jj++). ~$ o- W& K- q* Q* {- ? A! x+ @
{
7 f! P1 }' ?* ?2 h
/ N* x" T+ `3 S& I6 I. Y* ~9 } }
; B+ ?- Q$ Y& T7 @0 C$ S2 H */) N* n+ `3 r% n: x/ y7 h
//comment out all methods, N=100000 202s
# Z3 u$ A/ \2 R/ Q" [6 o& @ }
2 G0 e5 p1 w( I8 Y
1 V }2 V' _, |' V4 L R3 Y delete []b1;" B, `+ D; e0 v/ H4 k
delete []b2;
1 I. O9 P3 @3 ?, a- d, n" W, D |
|