TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
& G- p3 C1 C5 @/ x% T$ E1 b3 X- M2 h2 X1 c. r* X- w7 J/ {3 m! I4 b. u& v* b
理了理思路,重新做了一个测试。2 z6 Q! @4 B5 }0 t) ~
做了两个 vector 和 两个 float *, 都长 100000
4 s6 e# O$ t4 l' _0 h外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
# P4 u$ J! g, `3 U, ]
, V; M$ r, X: @* l# s9 n' h内循环试了4种方法,
% I1 A) s) i7 m- j" U1. 直接调用 vector inner_product 247s ( j- q% ?! Q$ F) Q
2. vector 循环点乘累加 237s7 }1 x- e6 D$ P3 j1 d$ e7 L
3. float * 循环点乘累加 204s! l. ]0 q* o( Z
4. 空循环 100000 次 202s
8 g2 \# i$ Y1 g0 t' n* m) F6 t& q# v, M
不做内循环 200s5 F, [/ v3 X9 q8 O- @8 V4 @
' L) u# ^1 x$ T, j: _3 D- d你昨天说的对,内循环本身占比是很小的,大头在其他处理。
) }7 F# g% h8 _% n另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% S" m; H8 L D+ |
6 P: t. ~; R- ^9 h7 {$ g( _; b
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)! T0 B7 a3 d% Z
9 {" M* L4 V% F) t9 }# ?) p- n
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 M& j# i) L0 q* f. q) m D
& P- z4 P3 R- c" c std::vector < float > vec1(N);( _+ ]3 ]0 y3 d9 W* N4 q) N
std::vector < float > vec2(N);% E" g$ I7 ~2 B; X- h* H
float* b1 = new float[N];$ }, t! R# f' K2 C1 b N1 H% R" \; J5 A
float* b2 = new float[N];
8 a3 V# V- A! i7 P
: m$ _; b; B4 g2 U# X for (int j = 0; j < 6000; j++)) S% m9 G) h9 q2 X4 }) _
{
3 O9 C0 @2 S9 r8 |4 T- H; C std::generate(vec1.begin(), vec1.end(), []() {
) O8 E$ o+ F) r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
$ w( A/ f& Y( g; d0 ] });1 `) T) i/ g! W5 g( a* }* v
) F+ o. ]; t$ k: f- f3 g) z) M
std::generate(vec2.begin(), vec2.end(), []() {
& E3 `6 L* J* ~" r* k7 s1 `" Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 C7 I, F0 X" a; a6 x, H( r
});
* ^; s' \1 g a$ K! {5 D" N8 k" U
for (size_t jj = 0; jj < vec1.size(); jj++)
& e$ X) Z0 ]; A1 E2 j {3 k, v- y/ R: q& D+ H1 q- h
b1[jj] = vec1[jj];( @6 M A0 A* Y E* M& v7 s& W8 n; @
}
5 ]6 _3 F" m9 ]& R- @6 L* o Y& s) w$ a/ h* A# o
for (size_t jj = 0; jj < vec2.size(); jj++)
& f8 j! }2 R! h1 W4 W; k; g {
, `4 Y4 y" f2 `( Q( S6 X b2[jj] = vec2[jj];
7 U3 E: H; `* H( W+ v" y }
( v" q' U4 T' r. n" E7 }9 Z8 D( I: x" f0 @3 m7 G
//Method - 1 N=100000 247s
8 |& B, {+ B, _ t5 ^% K6 v //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! W* ~3 j$ B6 g" T- ~0 d- ? ]
. F4 e4 h9 x% N% z; ? //Method - 2 N=100000 237s
. X4 e+ r& q( W$ d4 \& t* h; _ /*
( X4 b3 r6 L+ m1 E( w) T' N+ s for (int jj = 0; jj < N ; jj++)5 t9 j8 s0 i( ?( |4 v
{
1 a; i9 _. M' F: Q' `8 J fresult += vec1[jj] * vec2[jj];( J1 M, a2 l/ Z% e& c
}
, ~ ~# ` s: Y' P, i' _& h: F */
7 N1 _; J0 {! t" D6 v0 | 2 O; ~/ u0 K5 o+ K
//Method - 3 N=100000 204s
* U: \6 s' C2 o0 b+ P9 A) o /*
7 O8 F% m4 G$ C b& z3 J for (int jj = 0; jj < N; jj++)- a. A, Y9 K$ G. N# L
{* X5 ~0 o, [4 C5 W& a% \8 J0 C
fresult += b1[jj] * b2[jj];" M4 C( @4 U3 O4 [
} d1 r' k! t- }& i# m2 ^* N1 `" j* ~
*/
& p' ?. u2 w7 `) Z+ t& |! M9 ^ F4 K1 }+ g, _5 u
//Method - 4 202s2 H; t" {- H5 Q3 Z
/*, D* b i F z6 h$ V9 `
for (int jj = 0; jj < N; jj++)4 D5 V, r1 v2 u" s, ^
{
6 A/ e5 I, X2 s8 Y& v" n - o4 G/ N9 X4 w% o- }6 g" w
}# ^. m: P! U8 @. k9 z" \
*/
3 {! F" G# J$ b5 E* Q //comment out all methods, N=100000 202s
$ H( J1 _- V) i5 `1 H { }
! d# a* O( n% {9 ^2 o- T& G
5 ^3 c, I/ s/ {) H( q delete []b1;
' O- D" c0 B' k. O2 r, M% z- | delete []b2; ( S5 ]4 Z1 }/ N8 n- [! m" Q* w. L
|
|