TA的每日心情 | 奋斗 4 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ' | z8 @+ b; ?5 ~
# e7 P/ m6 M* K$ u) ]* m* a
理了理思路,重新做了一个测试。
0 t4 X9 l' m/ [( V$ B做了两个 vector 和 两个 float *, 都长 1000009 U( z* ]" o& G* E
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
, y# g @0 p4 U" k: i1 @7 {
2 U% k0 A/ U; M2 s5 ~6 `- R7 R1 y8 u内循环试了4种方法,0 @4 C6 C( p% F$ h! U @
1. 直接调用 vector inner_product 247s * s1 D& X i& W1 R' Z1 k. }, \0 ?
2. vector 循环点乘累加 237s
1 z* C! |( V* ]1 n0 U5 P2 D3. float * 循环点乘累加 204s- H' V8 P" v' G( e
4. 空循环 100000 次 202s: Z% _/ B2 y( a, K; n5 P* ?6 [& s
) M, i$ H8 C7 }+ K
不做内循环 200s
8 G2 p; W9 ?# T6 p! w! T7 h( p/ J) g* }6 R
你昨天说的对,内循环本身占比是很小的,大头在其他处理。# x" E; w. T7 U @" ]
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ J) w& [) j0 L, g K
4 h. x1 j- i( ?4 j
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- U/ [2 |+ s3 [6 L1 T& _7 N7 _: v) b0 w5 z0 U0 n9 w; Y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
9 p. y; r" N( i6 e( H4 ~+ b( ]; c0 n. E' B3 H0 A
std::vector < float > vec1(N);5 h4 T2 A7 A; E. k# U0 \3 g" i
std::vector < float > vec2(N);
# h# ]# p9 X) y8 p float* b1 = new float[N];
8 D6 r; ?" z* d float* b2 = new float[N];
1 Q7 D# I$ C4 j- s' M2 D9 [/ a* a2 x2 W$ T) h0 t
for (int j = 0; j < 6000; j++)7 K8 c# w/ ~; G; W# x+ i4 e
{
' X2 w2 q+ y! @5 k$ l! }7 u) o std::generate(vec1.begin(), vec1.end(), []() {
4 R( U# l [! R0 g) I" p7 [+ [ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 o2 [: o6 z) E
});
3 b( P) s" K4 \* w4 ~
: q: d# W; q9 {3 ^/ y' S( t3 u$ m std::generate(vec2.begin(), vec2.end(), []() {0 Y$ u, Z1 ^, c( k
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 M9 n. J- M8 u- E* A });
4 m+ A; @ l9 Y0 L
- N) ~0 T: K# G5 Z& N: o* q for (size_t jj = 0; jj < vec1.size(); jj++)
, p' V, |$ T4 x/ R9 o {+ m, ~: ]) a" |: H; A2 b
b1[jj] = vec1[jj];% o0 c! _+ N8 i7 x# i, Q, [
}
7 g1 Y- e+ S4 ~# z9 T% }
; d' a& R9 ]0 b. L) _ for (size_t jj = 0; jj < vec2.size(); jj++)
: r+ c4 b4 h( U0 q7 K, R Q, y! H {
, @5 q& c4 L; `; c5 B+ z b2[jj] = vec2[jj];( x8 u' k8 K1 j
}
/ ]+ l" }( u9 {2 ^2 Z& H1 B5 x* h1 ]( F7 z6 d5 L1 V- M0 t* q& q+ z4 L: u
//Method - 1 N=100000 247s . M4 n! k8 y* `# f
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- @% v7 S4 K9 D' \
$ M0 w* g) b1 l2 f& S0 D0 V# O8 e //Method - 2 N=100000 237s
: v; Z% z: L2 c: Y /*
% ~7 `( q! }7 V1 |, t for (int jj = 0; jj < N ; jj++)
+ D, R8 O. d% v1 q' K# y0 C {
9 v0 w/ `: j- D3 A7 h* L fresult += vec1[jj] * vec2[jj];' M$ D; l3 L, P$ T1 g
}
6 s0 x( G8 j* ^( v4 v+ Q- Q */
+ i7 ^8 x; P& Z$ @ 9 G2 t: P# K# W* g* R
//Method - 3 N=100000 204s* m; p I/ O, y, o I- g
/*
& S6 }9 k! r2 O7 B for (int jj = 0; jj < N; jj++)6 c7 s! `6 G/ }% e* \: N0 S
{
1 j9 D V1 U" d' C/ _. P# H fresult += b1[jj] * b2[jj];3 a! j, j" t+ x/ r8 c
} h; } c) j- }+ a h1 I5 U
*/( k6 w4 R) Z% n" d& r
6 e: J9 u* ?8 u' ^# N
//Method - 4 202s
# V. P" {8 d$ D; N2 q /*
6 p7 O- J5 G+ h( k$ ]. A& b for (int jj = 0; jj < N; jj++)
6 m: B( z, Y. _ {2 L* n' z4 l( d! Q& l/ w2 e
/ y! X3 l/ y! Z- n/ H) H; d. Q9 v. `
}
. Q" U, V1 z6 q( q5 W- x */
0 {5 \- g9 U# Y- M9 g$ s/ ^1 V; } //comment out all methods, N=100000 202s ; n5 h! r" T7 H
}* h# p" R8 H/ X+ q, N/ P' g
+ J8 `/ l! n2 m0 r delete []b1;, D+ X- N1 `, ^' t7 _
delete []b2;
; @( x. h8 u6 C1 v; q+ P |
|