TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 X! m0 Q; z& b! `4 x5 P L6 H
) D. G1 q- v% \0 E: |6 U
理了理思路,重新做了一个测试。% G/ b8 |" Z% Y! I! r- _. L- W% F
做了两个 vector 和 两个 float *, 都长 100000; u/ S! r1 _; E, K
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
2 r) U. K& `+ o0 t5 D4 v( \3 N* `, ?& F: m) i! A; k1 v0 Z
内循环试了4种方法,
6 c3 J% P$ V1 c3 M1 I+ a1. 直接调用 vector inner_product 247s ( p( O, c$ Z8 F$ l1 @/ E
2. vector 循环点乘累加 237s
5 [4 F8 J" p% i' Y& O" K* x$ w3. float * 循环点乘累加 204s
5 U5 h0 C6 d. E0 [: M4. 空循环 100000 次 202s7 P; P, r! @; i7 K9 K
! n; m, {& T; q+ I& @4 g不做内循环 200s
3 Q+ h e) e. L9 j9 h# v8 ]) }- J4 ^9 a$ W# ^5 R9 h
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
6 R$ o7 Z$ t- T- Q$ j4 }% B另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
! ]# T" e0 z0 ^$ J, _: d
. y8 \7 t1 Y' ~$ ~; }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
# f( j/ C5 f' P: I0 {7 P3 J# j) H5 o, ?- {! @
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
9 @: s! Z ^: v$ f8 M) ~
$ F% d( n" V# r u3 |$ a9 K2 n6 n std::vector < float > vec1(N);
5 E% @ U" d4 }5 }9 l4 J std::vector < float > vec2(N);
' }. y+ N5 f7 \; L B float* b1 = new float[N];
4 |( l F4 |! h2 W5 _ float* b2 = new float[N];7 P- w7 m: T V1 y' N* l
y k, p. h5 `% s2 @1 d
for (int j = 0; j < 6000; j++)
6 W: q0 ]6 t2 J9 b z7 a- D* t6 d5 H {& T+ ?# }1 ` d
std::generate(vec1.begin(), vec1.end(), []() {
* l1 D" C0 U M% n/ }! C1 S return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! o; S# Y+ f' r" W6 A
});
+ o2 L8 t! r: m2 z' k
$ u: G# h5 J5 I/ F2 q; B std::generate(vec2.begin(), vec2.end(), []() {
& w4 G7 i7 T) W& T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* Z a& p3 N6 ~2 ~5 B
});
: ~ V# x& ?& R0 _8 f) a+ M9 \+ J
for (size_t jj = 0; jj < vec1.size(); jj++)
) w5 @& J* q; {0 V+ L {8 U) f, {7 ]1 ~. T. {, P
b1[jj] = vec1[jj];
7 h" J3 `& t6 x }) q5 F- f( N9 a- |! x6 q% l
5 s5 Z+ }9 c, r! n
for (size_t jj = 0; jj < vec2.size(); jj++)
; T9 ?* O# h# B8 M5 C {
. f3 `, l* O4 h. Y! K, O b2[jj] = vec2[jj];
+ Y% E% L+ _2 g5 z5 K; {7 r0 O }: J: a* h, y2 t( o
! J9 \; v7 a1 ] //Method - 1 N=100000 247s
0 |+ g; Z& ?% r5 @ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);$ n4 n% f; b# O
7 X; z2 J9 R: f0 u9 u+ Q- E //Method - 2 N=100000 237s( P6 k$ R- y1 T# L% L
/* b- R: [: I8 }! J" b& R
for (int jj = 0; jj < N ; jj++), j! `: F _1 `, j: ?% o
{ G" K) f, G3 i
fresult += vec1[jj] * vec2[jj];
+ k9 Q+ X) S( g! v8 t, u& G ]! n }
; U4 K* A; R% H7 h. S */0 i) ]& J0 M5 Q! F. H9 T
" V& `( b# ^# U. o- T* ]* l z //Method - 3 N=100000 204s" {* g# \9 ? Z' N1 B1 O8 n
/*" E& U; T! x+ U3 H5 ~
for (int jj = 0; jj < N; jj++)
- a1 T1 |/ C: C {& D" G- V, j' a' V: G( L
fresult += b1[jj] * b2[jj];
: c' @* Q3 X( n8 \& m; C9 \* J }
- _- G# K' `* K( ]4 } */7 I2 a1 T `7 n! e( q
! i e5 }' e" J: k7 E* f
//Method - 4 202s) l( ^. K; p* v( M5 `. r3 I \2 \
/*- o6 |" d0 {' c) s4 l0 c# A
for (int jj = 0; jj < N; jj++)
: [: C% v8 q# v+ c; o O# k {8 g O! V) f; Q8 m3 D( L- Q
2 V4 Z- {+ I, |5 w }
# T, `# U) @0 W* X9 ~" p */; ]0 }: n6 t( j- g' X
//comment out all methods, N=100000 202s
( }- B5 [: e6 L9 j; r) k }
+ O6 g5 }6 T# ^& e) F F; \3 s! i. A( }. o% P6 b
delete []b1;
0 Z5 Z, o! k8 ^0 G! M# b! w3 s0 S" G delete []b2; ) d3 [5 M; H$ z2 y9 ^
|
|