TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* M: ^+ |+ M2 Q. A- d: d
0 [4 P0 Q( {2 j7 x理了理思路,重新做了一个测试。) ~" I3 J5 Z$ i/ x! u" \
做了两个 vector 和 两个 float *, 都长 1000005 A& Y1 _0 I5 T2 m: I: }7 ]
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& l$ B6 P) A2 c
4 g" ^: g: w+ Y5 Q5 N1 i0 B内循环试了4种方法,
* d9 x S. |8 R9 X2 T6 p$ `1. 直接调用 vector inner_product 247s ; Y- u* `* ? ?, z8 v
2. vector 循环点乘累加 237s; P, w. l: h9 ^' p
3. float * 循环点乘累加 204s/ A* i' @% U7 g8 X3 r1 @7 C7 }, p
4. 空循环 100000 次 202s0 u2 h& m4 q( D7 U
, M* A. [( I1 K不做内循环 200s5 O/ u7 [4 i( |. B& N! x' q, Q# o/ ]- |0 U
$ ]* N, E' ?) R0 \0 n. K" V你昨天说的对,内循环本身占比是很小的,大头在其他处理。
: x7 x8 h( x* k* k1 c0 Y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! k$ L6 w% ^! }% B; A
) I0 ^, @% M: r: x6 S! A
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' V) c3 P* @5 K& T
6 o+ R& ^. d* Q- Q) I
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
" Q: E$ E$ k; v: a$ o+ M: V8 \
std::vector < float > vec1(N);: H# v& {, K A4 U! A6 U
std::vector < float > vec2(N);
$ }9 ~9 Q. a( [# z, H4 j% K' w+ g: U float* b1 = new float[N];
$ {. P4 L; l$ V. d- ~ float* b2 = new float[N];
# _" O2 Y4 N0 o( ^) B* T# u3 {1 Q/ \7 l6 y+ ^
for (int j = 0; j < 6000; j++)( f: A- n3 U9 a/ B5 M- q; X$ V
{
/ F0 i9 r! ]! W0 P std::generate(vec1.begin(), vec1.end(), []() { \% T7 ]. E1 t
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 k2 R7 u p/ E( }/ N7 [
});8 P' M0 F c- ^7 O
+ @( u# O# T( p( D" _* f) O4 ^
std::generate(vec2.begin(), vec2.end(), []() {
V* j1 P0 ~ R7 A M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
7 a( Z4 n+ V# G& k1 e$ h, Y });3 d3 X+ m: O1 | d$ c
X* m% P3 p. H1 P for (size_t jj = 0; jj < vec1.size(); jj++)- c$ l! N" Y3 V; r7 L& n4 m
{
Z) c! Y( b. ^ b1[jj] = vec1[jj];
( m* o0 d% n {% u7 A; W9 A, D }
3 j0 n: l& ~& A0 H5 Y6 ^/ E3 S9 V+ Z3 {4 O7 |5 O
for (size_t jj = 0; jj < vec2.size(); jj++)
' V/ l! ~+ V# E2 c {
7 Z$ r/ O4 z8 |" ?$ H6 O2 g b2[jj] = vec2[jj];
1 b; ~. k c1 \7 s/ V1 A: I# B( c1 d }' D- M2 I; V2 Q6 N
$ _) _* K& O1 H5 I8 L
//Method - 1 N=100000 247s 3 Z) c" I; U) ?& h9 i# o
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
4 ^. B. A, @8 E9 Z
2 a7 }, N5 I. Y5 u4 | //Method - 2 N=100000 237s
7 y9 i$ l2 m4 A) s4 d6 Y, T /*
' I! S% Z. J6 ]% s9 M: y for (int jj = 0; jj < N ; jj++)
/ N c1 Z% N" W4 h {
, i, K- h" v. g1 ~ fresult += vec1[jj] * vec2[jj];6 i: c; s5 D1 o! A7 M. R8 Q
} V( f$ I8 l/ Q- h! |8 X: ]
*/
) C* m _, r3 l1 x0 ?/ x, W6 R
+ h/ T: m1 ]* R) `" E( } //Method - 3 N=100000 204s. z. J2 x( u" _ ?
/*
9 g+ ]$ }2 W$ } for (int jj = 0; jj < N; jj++)
4 b4 v2 N3 N, `, ?7 G { c7 p# C4 Q' j5 m- k, G6 w
fresult += b1[jj] * b2[jj];
6 N) L3 V& l; q5 [+ G }# D! Y/ j9 i, ` g0 o9 l
*/4 r$ k3 ]' b& l
7 u' o8 C+ c8 {1 c& l* O' Z //Method - 4 202s
# }0 r/ D1 B& I0 I0 l5 ~ /*, Z' A9 R2 [5 V" P( z" h5 U
for (int jj = 0; jj < N; jj++)4 n% G/ \" }) J ^) L- d6 f
{( v5 g! P2 `9 H8 @) m
/ G6 R& o9 F; r. G9 {# o U
}9 h; ?; b& V s+ h! A, B
*/
+ B2 C, p3 H2 h" {7 Y& c* F //comment out all methods, N=100000 202s
5 v8 \- {; u) }, P }. ^9 V" ?+ P/ T: Y. F' C
" L Q" P0 l" \* x6 I" w delete []b1;
1 ` X" W3 ~& n1 Q delete []b2; 6 [9 o! O7 J, H) ?% L4 n
|
|