TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 S3 b# T8 e! V6 w& |6 ~ u. }' i" x1 @
% V0 q0 L% N; G# y. I% P理了理思路,重新做了一个测试。
" `) h' i' N# E& ~0 Q做了两个 vector 和 两个 float *, 都长 100000" o2 k0 h9 u5 d# A6 j# Z, V/ u
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 P4 D$ L, r) U+ x+ o$ ^
( c/ a2 X; u" K- Y3 V内循环试了4种方法,7 w2 e, E3 v+ ]+ [1 m
1. 直接调用 vector inner_product 247s & C2 V# x n- Q( x$ D9 Y' |
2. vector 循环点乘累加 237s1 n# V3 x- n; c- x$ K
3. float * 循环点乘累加 204s
0 i0 Q8 K' W$ v9 O4. 空循环 100000 次 202s
/ ^$ V+ K& h3 G! c8 n, }; w3 W" L0 B" B$ d# K
不做内循环 200s
5 F# H$ C% R5 Z7 I* ~7 X
/ C; P1 `# a: D7 {% l7 R, ^+ Q a) Z* j! @你昨天说的对,内循环本身占比是很小的,大头在其他处理。 m/ n& S# k# T. z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 L! ^3 X, R, `% j7 e
7 Z0 S7 G2 a4 l
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, l3 E' E- r: W- V
( q( Z- A; u" _5 x/ ^(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); Y- }$ d( B( b1 e2 H
6 \: W m0 a+ e$ p- \; H, `7 N4 S std::vector < float > vec1(N);
- Q( H+ i$ w( D6 H- p std::vector < float > vec2(N);- u" P: B# d5 W
float* b1 = new float[N];
% w' h/ D- U2 x! n% f; [' A float* b2 = new float[N];0 K' D4 b) j1 ^$ a: J
& g( M. B. K- W8 Y+ b; E
for (int j = 0; j < 6000; j++)
: K1 n# L8 t( o1 c/ w {
0 G2 r p& `4 o& A std::generate(vec1.begin(), vec1.end(), []() {
) V' v# a( u0 ?5 V9 ~. E return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 O3 x& v Z1 t2 _! j });
( i) l. k8 F4 M: A
9 M- l* S1 I0 W# G" l8 { std::generate(vec2.begin(), vec2.end(), []() {
; u( Z& d9 _1 `) ? A0 x H: w return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( F6 O; V8 L3 Z" s5 t6 e
});: |& r# r8 B- \( X1 h1 a/ d* V
- ~! `# a) o% j% w$ @# S5 g6 a* r for (size_t jj = 0; jj < vec1.size(); jj++)9 u. A+ Q, F+ E2 i0 N3 \# E; g
{, K P0 E5 S2 X; W' q
b1[jj] = vec1[jj];& x& [, X* n3 ~: D! Q/ T9 ]
}! q' M% i4 e, n- D1 f# w h. E& U7 y
; ]) d. E, k$ _& I for (size_t jj = 0; jj < vec2.size(); jj++): K. P' c& j: C1 Y, X+ w
{
& O5 L) l8 U6 a2 V( v/ C4 _) G b2[jj] = vec2[jj];$ J1 h0 l9 T* G
}
" K( [: B, Q1 W* [) i: u
7 Z! e5 d5 \8 ?: } //Method - 1 N=100000 247s 1 c" k# ]" S0 l. g0 I
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
' G& h) g' q. X - o* a7 S! q/ H% G
//Method - 2 N=100000 237s4 [+ F" G4 M; U1 s
/*
$ D) J0 i3 b& D for (int jj = 0; jj < N ; jj++)
+ M Z, }# k! y, G. N$ B {
: y3 B* W, ]6 S5 W0 F2 F fresult += vec1[jj] * vec2[jj];" p, ?4 M* b) l
}+ r/ G6 f/ ?( ^8 ^
*/! J8 t$ F+ d; h' t: F; O
+ j+ o+ ]+ h& q% Q5 a8 S //Method - 3 N=100000 204s
$ ?- G! v) O: M8 ?# s, L2 [+ \ /*
# b/ ]# x- z5 \" ] for (int jj = 0; jj < N; jj++)
3 M( y! ?/ X) K. y {2 l0 G o! a0 R4 j' W4 J4 a
fresult += b1[jj] * b2[jj];: r# m; U- ^ l B' h
}
, F! H+ h& v" T m# O0 U, X- y */8 q6 \, m3 o$ }0 B6 m8 q* k0 a
; [! L" M) @, ~% J //Method - 4 202s" n% V3 Y3 F5 ?( s
/*
9 _6 [% R& f3 [. Z P7 y+ T3 {0 J for (int jj = 0; jj < N; jj++)5 \9 `) y! Q2 `
{% e! i+ I, X1 G, E, V6 h
1 `# F. n, g! U$ r2 C+ a5 l }
: R4 K, n. x- U) ^ */
2 {8 o% a' C& _2 ` //comment out all methods, N=100000 202s % o: X! V& B) Y6 o
}& _6 l' [: L. Z# P+ ^
$ E% r* E3 j) M* Y/ v# P& _
delete []b1;: {1 C9 F1 \& ?7 f/ N0 ~
delete []b2;
0 @' O; q$ i3 Z7 i3 o8 o |
|