TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 G3 r( D9 P) p/ A
, C# X% T( X/ x3 j/ u8 U
理了理思路,重新做了一个测试。1 w3 W0 I/ S! m* b* m! x
做了两个 vector 和 两个 float *, 都长 100000
. w% G2 `, c/ z' ]3 |外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
/ b2 ^* a" ^2 B7 w) s! V! C+ D p5 p2 H3 M- p% u1 o" D; B
内循环试了4种方法,
4 b x; }6 B; J1 q; j8 V! E; `1. 直接调用 vector inner_product 247s 0 R( g& X5 ?, v. y
2. vector 循环点乘累加 237s+ f- a2 W8 r( V
3. float * 循环点乘累加 204s
. g4 E. n, q4 w) O6 A% k7 m4. 空循环 100000 次 202s E5 u# i- o9 @- f+ Y
& q$ C7 C; H& c$ u+ P
不做内循环 200s
% k2 t) s( [2 E9 X* C5 p, W! |* B# @: @, x! m# Z4 E
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 W. G {) y/ i8 k另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, ^2 M5 r" m$ S1 y: h* R
2 `2 p! S/ i, O; P2 j0 g至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试); ^2 u J. g2 K
' k* G% l5 V: a7 u3 q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 h* w& U/ k8 A+ v, ?, F- f. ]
+ t9 s$ a' {9 J! @0 f% C" Z
std::vector < float > vec1(N);
1 w/ k& T$ X) k |, t std::vector < float > vec2(N);
( R3 a: `; o( ]3 N! T& e float* b1 = new float[N];- M. O% X q$ Y$ U. N9 B
float* b2 = new float[N];
! d! e( r$ m/ `0 e
+ n! f; {$ ^5 x- i0 }& W" ?2 G4 E) d for (int j = 0; j < 6000; j++)2 h2 w8 f+ G: R2 d4 ?. \
{9 B1 @3 a1 ]# E6 p
std::generate(vec1.begin(), vec1.end(), []() {
# X3 X" Y6 o! m return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 w% u8 k6 I% c/ W3 `; s% a! I
});# c! `% C) O4 z4 H' t% ?- T
1 x9 M3 D! W0 U' h! o+ ?
std::generate(vec2.begin(), vec2.end(), []() {
" j) t1 h7 i. j! p" X return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
5 E4 [- _2 K0 a& T7 R' I6 J });8 M% P3 r. U+ d" c
% c9 k j3 b/ t4 r4 C0 Y
for (size_t jj = 0; jj < vec1.size(); jj++)1 c! H3 s, H; g5 Q" ?1 i
{% d( W' [3 Z6 E
b1[jj] = vec1[jj];; B6 J+ |0 n1 s, P& L: [
}' \0 |/ ]% j, \/ V9 A5 V
, b& J [7 }0 N for (size_t jj = 0; jj < vec2.size(); jj++)4 B- t/ s5 h1 D0 M7 Y9 j, A) x
{* \7 r* m4 Q" x4 k3 X. c
b2[jj] = vec2[jj];
8 s: }0 q: G( I& L! t. J, \ }- R. A9 c: Z* i1 m
3 v1 X8 W5 a+ |2 U1 `+ }6 o* H5 _ //Method - 1 N=100000 247s
- i8 ~5 y% G h- B: a //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ l' i5 [' v1 d5 C; @
9 [! v+ a3 F# f" z! ? //Method - 2 N=100000 237s
4 w7 a9 z6 q/ _ d# Q( @ /*
/ \! a6 a: }7 f h* s v! h for (int jj = 0; jj < N ; jj++)
/ B" G ]5 w( ^' k; E' Q8 w& f {) B- ?& c: Q6 m; r3 K1 h) `
fresult += vec1[jj] * vec2[jj];; l; q0 h2 _* n" d- n. T& O
}
c8 E `0 c# e9 @, _) Z */9 @9 S: C3 h3 I( ?# U) K5 z
$ P) C; {9 c# s% Y9 P# Q' Z5 ?
//Method - 3 N=100000 204s
: I4 H; H2 u6 l* I /*
0 }/ b1 C- Q0 n- k- o for (int jj = 0; jj < N; jj++)
4 f) a$ d2 L% ^& F4 ]. N' f {0 `% P6 ^3 G; M
fresult += b1[jj] * b2[jj];. F' `/ H5 Q T# e, k
}
+ H8 P' K3 v& v. v( ] */
, L- O& O* j1 P& y8 M0 M! S1 a
! R5 F2 }+ b, t9 C) a* i' Y //Method - 4 202s
% W( u- R7 n, Z5 e9 G0 F* U$ e /*
* \" f! {2 c- N for (int jj = 0; jj < N; jj++)
5 J) x6 c8 x# |5 `$ R+ H {* x% [3 ?, w' ?, D6 _
) e, I8 ?0 T" [' h9 i
}
% C, {" c0 M6 E+ s */
( u, o) C1 M4 E! D //comment out all methods, N=100000 202s
3 M f- u: P, Z3 L4 a, I" l! S/ U }0 |5 v ^6 M9 m& h
: z$ ?+ n* u4 E# u0 S delete []b1;$ L7 ~$ D8 G; z* O5 C
delete []b2;
. V/ h$ o2 ^( H. {( h0 v5 o |
|