TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ N w: Y, q: H6 Z; G, W. O
8 m7 h* ^: k: |0 [4 t$ g理了理思路,重新做了一个测试。
8 J, E5 q( N7 e; s* M, O做了两个 vector 和 两个 float *, 都长 100000
5 q y: G7 z' P2 L外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 Z N+ X1 Q4 q9 J; D1 X" c9 _2 ~( R$ E1 y' R
内循环试了4种方法,
2 u: c7 N) U' |+ [1. 直接调用 vector inner_product 247s
# @0 X1 \4 h" \2. vector 循环点乘累加 237s' c6 E. b, f8 d. {) M" L
3. float * 循环点乘累加 204s8 F7 b: [: d! ~
4. 空循环 100000 次 202s
. H: g1 E% @$ L5 d( J; @- B2 a0 m8 V' Z4 o+ n0 Y7 @2 O
不做内循环 200s
. O* ?: G* E& L% M3 i/ J+ w) | u) R
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, T) D# k4 J- G5 t
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 S! n( v C+ ?
- ]: Q2 z; A9 g" @) e
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
) m: m- u) a( K! l) m" m0 b0 P6 l5 M* |, b
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 v6 M) u8 [$ c- t$ s' j' b! |2 p. ?2 ?6 t* e6 @
std::vector < float > vec1(N);( V8 s n* n6 B! K$ e4 ]
std::vector < float > vec2(N);/ f! M! C$ n; P8 t, z
float* b1 = new float[N];! C. k( O$ l4 k4 `- k
float* b2 = new float[N];' Y( V4 j( S' g0 B3 w/ h
4 l6 {% a$ I1 i$ _/ j4 I" w/ e for (int j = 0; j < 6000; j++)
+ _& D3 b0 Y5 a' ? {
7 p3 W0 @! a$ ]) g. t std::generate(vec1.begin(), vec1.end(), []() {
* }: N% |5 B ?# B return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 p0 z! _6 a3 u- X6 D: G
});, Y) _* A1 M/ S9 Y' l6 l8 H
9 L- l$ n( P* Q std::generate(vec2.begin(), vec2.end(), []() {$ @: }5 W1 q* z- o. P8 K
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) @: \) |: v3 G$ R$ h
});
2 X0 ?1 L5 n. F* {% _: P$ `$ ` e8 w! u/ Z
for (size_t jj = 0; jj < vec1.size(); jj++)) U9 J% @) R% P* `9 F) z
{
. {# Q8 e1 O _4 q" p6 y b1[jj] = vec1[jj];; Q6 N u4 m g* T$ W) j' Q4 Q
}
9 v; H/ W8 ~9 F, p' u3 L
& {+ I( C N3 v for (size_t jj = 0; jj < vec2.size(); jj++)
0 S" T7 P$ t7 w2 _* ` {# B2 M! n$ F3 N! V" Y4 q$ I
b2[jj] = vec2[jj];7 L7 b6 X9 |& U7 E# P* a$ K6 z
}
+ I8 x" H3 S3 m% O5 q
5 b- r* t! M& Z: [1 z //Method - 1 N=100000 247s
8 x# P" u5 f: V! @ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ `& J: V% H9 ?5 r+ |- Z
; h1 o: N7 ?. ]' a1 }; ?# P9 A* X //Method - 2 N=100000 237s/ a( V# E2 p t( @) R
/*) z9 n7 d1 k1 t$ s
for (int jj = 0; jj < N ; jj++)
+ N# }; I/ o0 }" V7 z: r {
3 a8 }0 H6 m6 [" V- t8 i8 w fresult += vec1[jj] * vec2[jj];& s% h" o- }/ w* F" T( O" D) s d
}/ \8 L" K! b9 c
*/9 C7 E$ t0 M. } a+ e5 ?/ u+ y
, |4 D0 k6 [( r
//Method - 3 N=100000 204s! F5 u" p& u2 k6 r
/*" I" T, C3 z3 w4 @, b
for (int jj = 0; jj < N; jj++)/ N$ G' @& ^$ G1 n: l1 D
{
% ^, N; X7 W; W- ?5 ` fresult += b1[jj] * b2[jj];
) G" R% m! Z. y! k( Z8 W }# {0 G" F Y% N' W: v% I! d5 S- Q
*/$ }( w+ f+ H6 T8 R3 ]7 _
% [3 D) w3 I6 p0 q2 q //Method - 4 202s" N" F2 v6 }% n! j* t+ i8 _: n
/*, n" {( `0 Y6 H& o) x% ?
for (int jj = 0; jj < N; jj++), _" ^+ o$ n0 f3 [8 u
{& P8 l% c c! _& j3 o
# \/ F8 w& s1 f1 F% j' H$ u }! F$ i' Q! ]5 E7 D
*/
# g% K* B& c8 c0 e //comment out all methods, N=100000 202s ) s% ?9 \. C; y: P. C8 F
}
6 E: p6 J8 b5 ^. B, H/ b
- p+ ^& ]: u- V# k4 }3 | delete []b1;3 Z9 v) M) B' D1 R# P" r$ l
delete []b2; 1 t1 V$ }# p9 u% _4 O
|
|