TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 % ^' m. F: z& Z6 h2 q
$ U6 Z/ E9 b- ] Q8 O' t9 G
理了理思路,重新做了一个测试。
3 U; P3 h; E$ T$ L, E7 |做了两个 vector 和 两个 float *, 都长 100000
. q |+ E' v1 V. ^- {" n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. ^& E+ O: j, c3 P7 f
* ^# ~0 k1 S. k! d, N4 M
内循环试了4种方法,
; H4 j( [: V4 u3 S; M# t) J1. 直接调用 vector inner_product 247s 8 Y2 y+ K5 u7 g0 w+ h- [
2. vector 循环点乘累加 237s
1 p" e; z" l7 C* W3. float * 循环点乘累加 204s
/ j" I5 \% v0 Q7 B4. 空循环 100000 次 202s
& ?7 W, x1 A0 u9 K1 m; R6 U
" Z8 Z5 W: G7 D+ y+ Y不做内循环 200s
6 f J, R6 H4 z! I0 Q- U" T0 h
3 j. {: E9 v( l5 M( R p你昨天说的对,内循环本身占比是很小的,大头在其他处理。9 N+ r8 f$ X% v. B3 y& B5 @
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 o1 s" C$ u" r, c S5 W$ T6 Q
6 y! T& N4 S. \$ S3 K0 \6 ~至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 D( [7 {# Q: O" L6 E: r
5 G/ f* L" Q: c1 t# ?+ {
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 ^! Z7 ?; m# F1 L
( k7 _. x u$ J; O5 I( N8 a' R std::vector < float > vec1(N);( p3 o! p. x8 V+ N! ]7 }5 G) V
std::vector < float > vec2(N);- @: f; ~: @0 d: Z4 A
float* b1 = new float[N];
1 \$ ~& w+ f: ^* q float* b2 = new float[N];9 B8 R! |$ y8 z3 Q; I
7 E/ D! a* h6 F' h4 L1 ^% U, n3 I! j
for (int j = 0; j < 6000; j++)
8 L$ b6 H4 x2 I9 X# g {
+ v* B7 v! n: W* x M std::generate(vec1.begin(), vec1.end(), []() {0 z r. ?$ I+ }+ J% B
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" V. m5 |! {/ m" f8 U });% q W! w+ H; F
. [3 N. n3 y* c5 x+ i- D: N std::generate(vec2.begin(), vec2.end(), []() {
, t" Y8 u& a$ A! z7 A, t return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 \/ o! q& z- m# M2 D3 |6 K
});
. t! z1 S6 L2 I; N- f; x: H; z# D X; X% ?0 @
for (size_t jj = 0; jj < vec1.size(); jj++)) l# h+ z. S" K$ a8 Q4 q
{
9 ?" V( \0 J; u) I9 \5 M [ b1[jj] = vec1[jj];
7 O) E+ x7 A7 d6 y9 I }
: a* A( G1 R5 g0 O
9 A' p/ V4 {2 A8 G/ ?; H6 R for (size_t jj = 0; jj < vec2.size(); jj++)
% `7 z. q+ [- S {9 }" a) x3 e0 Z
b2[jj] = vec2[jj];
. ?' J6 @6 g, `6 ^0 m. r$ l% x& Y }2 r9 M" C7 w( a9 i Z8 b- E
1 b! l5 n- g3 x0 q0 _: j' b7 ?, u //Method - 1 N=100000 247s
1 U C) w$ t, I- q //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
) X0 p# y; V# a( k2 X v 4 d+ H* `9 I3 G% a$ p+ p5 C6 G
//Method - 2 N=100000 237s2 f- \: _( n; B: k+ S0 `
/*( B& S3 i; c% ]3 [ ?0 O# X: D& }
for (int jj = 0; jj < N ; jj++)! R/ z, s0 [+ q: A A. V, a
{
4 x# g; U- l% c fresult += vec1[jj] * vec2[jj];$ O' v/ R Q* I
}
4 K5 m- W: Z& O- `0 v */8 N8 f5 z4 I& Z, S8 D2 ]
9 S! ~" B- T t //Method - 3 N=100000 204s
6 o& N6 L; r5 a+ { /*
# Y4 U" u) a0 ?" b for (int jj = 0; jj < N; jj++)
) u- A- \4 D. v4 C6 q' W; ^ {
6 y7 y& g6 \5 v- X8 U3 @5 q9 }. m fresult += b1[jj] * b2[jj];! _% j0 h% S8 i! X/ u& v
}
% d2 ]( H3 h% z0 p7 ]! ^ G */
: s2 P$ X$ i! f, R2 h. `* s. c3 L7 A
//Method - 4 202s' C. ~4 W0 ^7 W8 B8 h" }
/*
; k2 y) v2 M7 U; i, Y( K: [; r for (int jj = 0; jj < N; jj++)9 w/ U$ _+ z( E& t+ t! A! a; }
{9 p7 J& G! M' [$ \: J
% r$ [4 b1 w1 A, ], N* ~( n9 ^# Y/ ^
}9 x% O& N; Y0 d" M% g; ^
*/
7 P# W/ D+ Y+ ]' W: M4 Z2 b //comment out all methods, N=100000 202s / F+ r' \& z4 T
}& d0 i- @1 ]2 g# X F( v" ~
1 ?$ C+ u; @9 [ delete []b1;& ]; k/ _$ i6 B- \
delete []b2; , k: a' S4 e; r% g1 d
|
|