TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
1 U0 i* F0 E# _) E+ ]+ ?; Y! q$ R- f/ {. q; T v' q$ Z
理了理思路,重新做了一个测试。: y! d1 C F3 V* F" ]; m' d' j
做了两个 vector 和 两个 float *, 都长 1000004 e3 T$ b2 R% G, c5 _/ F+ C- P
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 Y$ q) v. |: L" l- }9 b
8 H, M5 v3 d0 c' [" Q; U2 l) d. |内循环试了4种方法,
. U8 x4 v( e6 [# k1. 直接调用 vector inner_product 247s $ s! U3 z; l9 z. x- a" J
2. vector 循环点乘累加 237s
( |$ r- d( z' z. l1 p3. float * 循环点乘累加 204s
1 l$ U3 W6 R& a. B% ^4. 空循环 100000 次 202s
( c6 g7 h9 ^# r! Y
' T6 d7 Z% K* d% S不做内循环 200s
- ^$ I# z! [/ F- D6 k+ o) F
% A2 d" C: S" E8 E8 i你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( i+ p: a7 A$ A# f; Y. ~另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 g) |7 w$ P4 k8 Q" e: g! j
7 s! e R8 g- N1 S) z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ o4 t0 ]0 ~- n' D
; s, ~0 ?" z) p% k: M9 W(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)$ C1 T7 b$ Y" s# Z
" |* \; {8 R) r5 N" o
std::vector < float > vec1(N);& O1 K* j9 T) D( a# C6 P S/ }; V
std::vector < float > vec2(N);, s8 E! m5 j1 T# S: ^( s5 v
float* b1 = new float[N];8 g) z4 }" F9 m, c ], G
float* b2 = new float[N];4 ], h9 H( \6 B$ t
3 Y+ @( j; d( k$ B# u- G `- q for (int j = 0; j < 6000; j++). \- J# |/ N+ b9 u& ] g
{
# L3 F% x8 R! p9 T: R7 l' r( c std::generate(vec1.begin(), vec1.end(), []() {# H% }4 j9 f1 x* U1 ?! \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
; e7 d) `! {' W1 @% ~- F });
- ^- L7 O. B2 V% c4 l3 d2 B# p
std::generate(vec2.begin(), vec2.end(), []() {8 y1 I7 U5 K$ H0 |. P# r6 o" l3 \7 r! }
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# i t0 z6 \1 \" f! W/ _9 F
});5 Y1 H. X+ ]; l( K9 j) h+ l b0 N: Q
9 ~3 M$ e# o$ ^- F# P for (size_t jj = 0; jj < vec1.size(); jj++)
2 U! `0 r/ i5 N3 q; ^ {( I% }& s6 x: j8 m+ g0 N
b1[jj] = vec1[jj];- `: h& [- k8 }% |5 D
}
7 Y- K) \$ t$ s* y! [; i
h0 W( V/ M$ t7 \+ I* u8 { for (size_t jj = 0; jj < vec2.size(); jj++)7 P8 {* H, d4 N. t+ r+ z
{
9 d4 j: r. V i# s7 B3 I3 K b2[jj] = vec2[jj];% l% b# V( c! A
}
- n; p. i$ s0 l" b7 E( q. L8 j( r& _3 r) T
//Method - 1 N=100000 247s
# B+ ^% J# v! `" O% `7 p' I0 z //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 u+ l1 o1 ~( B& \ v6 B
, p! } H6 R( H' H* d! W //Method - 2 N=100000 237s+ d( t# F1 r5 l" n' B& ?
/*# x, t9 E5 r$ K9 c4 I
for (int jj = 0; jj < N ; jj++)
0 a, i! I. z6 r m" b* S {
7 L" A5 x! J( v# I. g fresult += vec1[jj] * vec2[jj];
1 N: [ C6 j8 w7 `% a* g3 p! K }4 A+ s$ O' _# f! U# B8 p } b3 A. M
*/
7 v4 T" ?0 j' R, i u: r" [" | l8 \
//Method - 3 N=100000 204s# ^ q: h3 _ \6 ^
/*3 x/ T& t. C# T1 s
for (int jj = 0; jj < N; jj++)
8 i& n, d" v. o0 C7 @4 {4 X {# l Q6 g9 H8 M" q- g. G( x
fresult += b1[jj] * b2[jj];9 Q7 N1 {% e# W6 R+ A" w8 M* z
}$ `! x" ?/ [" @
*/, P0 M/ {& X4 Y& r1 {
! z0 a0 o# d) B2 l //Method - 4 202s
. Y5 Z& n S m* w) n. Z# H /*
3 Z6 r, x P- F! H* c for (int jj = 0; jj < N; jj++)
( g( U- W5 ?" f K {
6 K. F- B$ o6 q! w$ s# ] 8 O, R I x: Q0 e7 m0 z" g
}7 }6 I1 O1 \ C; L" ^9 N
*/6 G4 f ]6 u5 I0 H6 N! N% N
//comment out all methods, N=100000 202s
1 S f. N. ]0 {$ h' J1 x% a' x; c- | }
0 d4 ^6 s4 O( b* ^5 }0 E2 T
$ C2 q; w% e& L+ x delete []b1;7 C: y0 d# J* ~; J- ?$ ?
delete []b2; $ Y6 _# ?; z. |7 J2 G, f+ h7 q
|
|