TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* P( C3 z$ q8 n" J! m8 i
H- O9 A# K! C/ O+ t理了理思路,重新做了一个测试。
$ F F9 s8 d& g, Z8 b4 j5 }做了两个 vector 和 两个 float *, 都长 100000# ~4 ^2 d, \, e. f
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 A" \2 s7 l& H6 h5 r* H) G- e
/ `& H/ l$ G' X- p% e内循环试了4种方法,* k7 Z" X% g8 T8 l% K
1. 直接调用 vector inner_product 247s
8 k- F8 E5 r# w9 a0 @* H2. vector 循环点乘累加 237s+ }$ |( o$ y# ]- D- o
3. float * 循环点乘累加 204s
- B2 O) b* [* f" V; Q+ S4. 空循环 100000 次 202s
0 z8 _ q, Y* X. u7 L1 K4 A; [" C* ~& O p# S
不做内循环 200s1 F; ?& z9 Y" b" c
0 V+ b$ Y0 t# {' T7 n6 V% f你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( N' f, R( J+ G4 [% ~8 R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- N7 d9 z; k& v$ g I: a" l
' Q. G! L$ I- _0 ^至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 e9 D. J$ ^. q+ E, H2 U
# y i( V( s2 C0 G9 K; B7 m9 o
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 o6 R, |: R0 W/ b" V
8 ~; N$ Q7 B4 @$ A std::vector < float > vec1(N);
e4 l q. ?; r: P std::vector < float > vec2(N);
. W2 q: f) o. h/ Z9 J float* b1 = new float[N];
5 V& U; w2 |9 D3 z, Z9 { float* b2 = new float[N];- i* q$ i- f2 n
, v6 A2 N$ g$ W W+ J+ M for (int j = 0; j < 6000; j++)
5 ~% m8 B. u1 `; q7 q6 w {
% A8 @' b5 {! O5 _+ p' | std::generate(vec1.begin(), vec1.end(), []() {
* C0 c- |& P1 A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 b0 [ s' j7 l' b. z! t; _# z
});
) N, D! b/ z5 V+ ]4 q$ h, w. O. I
# D- X8 W0 z: F# Q( E k std::generate(vec2.begin(), vec2.end(), []() {7 k1 v' m4 o$ U$ y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
1 s3 d M: f) a* @( H });$ {8 n4 D }) v% s8 i9 v r* [
/ C( d# m5 t$ z# e0 H9 j4 M for (size_t jj = 0; jj < vec1.size(); jj++)
: M0 T: H) j% q4 @* R; e1 }9 ]! U {' t2 @7 u# v7 p' A9 v
b1[jj] = vec1[jj];
* `: h. C3 S$ R }8 M) ~: i+ ^ V# w2 C
7 r+ U$ N0 H, B6 t) L for (size_t jj = 0; jj < vec2.size(); jj++)
0 s6 x1 ^8 i' f9 r* h P {% Z% U! J2 ]) z/ {$ O
b2[jj] = vec2[jj];
9 O2 c; G) z; i, M8 _# }( l5 Q }
: d# P& Z$ m$ k7 F9 ~' x, ^$ k/ l0 f" v4 }3 d& D
//Method - 1 N=100000 247s & n5 y& [, @. w- P n
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; Z! q+ W3 ]$ ]0 B ?: U2 H
! P6 y3 Q+ |7 I/ I. G# j
//Method - 2 N=100000 237s+ E) H+ q4 ^& N- E1 @/ S
/*
6 ^ {7 d) y/ O, F for (int jj = 0; jj < N ; jj++)% i6 K: F9 r5 @9 b" w g. C
{
G3 o& [: N1 T. G5 M0 N fresult += vec1[jj] * vec2[jj];) M( h6 q. U% T, Y6 P, {1 z. q1 R
}
: W1 D) d, E- z. D) T* y */7 S) \. H% _2 K& j
" w: \1 W' f' ?' j9 q0 O5 S& Z* v7 {
//Method - 3 N=100000 204s i) Z" m" y/ o) a0 B( m3 q
/*% h# \/ m3 i8 j# _4 E
for (int jj = 0; jj < N; jj++)0 ]/ e1 n. C9 i( m: {
{
; ]1 R% C: |' ]- J fresult += b1[jj] * b2[jj];6 m) r t7 h% Z' P6 s& @: D: ?
}
4 U$ L8 i3 p+ {/ f/ I4 z */
8 B Z S, @0 ^
) j- ~* K& a; D! e //Method - 4 202s
4 |( K! W9 v+ \7 O /*
4 Z; j( l: l. P3 A0 L for (int jj = 0; jj < N; jj++)9 l5 f; j1 N: K1 t: ?- d! R* F
{
6 w3 r& `# P. f" R3 ^; d
* w5 @: z1 e+ m }7 D5 `( y/ C9 Z& o
*/
2 m$ u6 @* q4 L; ]2 ]) ^8 Q; p //comment out all methods, N=100000 202s
; H# o8 Q9 M# p4 j+ f }3 h, O9 |6 ?1 T' u
9 D. b. |$ j. \: n$ ]+ v
delete []b1;. k/ \- y) B0 W* S; j( g
delete []b2;
5 B. w! c [8 S" @5 `5 u& V- ^ |
|