TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) x1 w7 s, P. n
' Z) _2 D8 Y* x t1 r
理了理思路,重新做了一个测试。
: ^0 J2 R( ]! p9 A5 w$ A做了两个 vector 和 两个 float *, 都长 100000
. A5 t) a0 p5 B# C外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* g( ~( u2 E: ^$ n ]# |! w+ A- i, c$ ^& X% P+ q6 A; U
内循环试了4种方法," |/ V( T# X2 T/ m
1. 直接调用 vector inner_product 247s % S( Y9 M/ {7 y9 S9 ]
2. vector 循环点乘累加 237s
. l4 t3 h% C& N3. float * 循环点乘累加 204s
8 F9 B* O( C% G4. 空循环 100000 次 202s' W2 F4 a# E1 M9 t/ Y8 D
1 p4 A' Z. b3 e& V0 w. V$ W' G% W不做内循环 200s& |. a. V( k y6 J7 E
- g- q; n( U: J% V& A你昨天说的对,内循环本身占比是很小的,大头在其他处理。
# {7 ~# r& [% `另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
+ ]* q" D* d/ j2 L! w* t) ~' ^; W, z, z7 v9 Z) t2 Z: |
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
" m& S, J. x2 F# m" {! X5 e+ n9 s, A
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 ?' R/ K6 g! j4 K8 p
; T) c8 x! E1 C8 o& q' N" s std::vector < float > vec1(N);
9 F2 G3 M2 r( C; @6 r* ^ std::vector < float > vec2(N);% z' b' o8 h3 f9 V% C$ \! s4 O
float* b1 = new float[N];
s2 x3 j5 L! N. X float* b2 = new float[N];! G c6 ^8 ?" k) r3 z
; F$ r7 P' e4 f
for (int j = 0; j < 6000; j++)* ]) k" u, Z8 r( ]8 m( x: B7 J5 A$ R( c
{) M% o$ m3 _/ l O: I* k
std::generate(vec1.begin(), vec1.end(), []() {: ]. L" l* Q6 M% Z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; _9 u6 A( L* y" i
});+ x6 D& ^; n/ x6 A0 }
6 ? w i9 q7 `" z! b1 D std::generate(vec2.begin(), vec2.end(), []() {( X4 [$ j3 @# g5 p* l* H
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 v, w$ e$ [7 j });
* p7 ?. l$ b3 v) G0 t# h
! {* H( r8 j. I, T9 k/ | for (size_t jj = 0; jj < vec1.size(); jj++)
/ }8 }' i3 W9 Y5 `. b, q' { {
?' z* c) v) q$ n8 o% j8 H b1[jj] = vec1[jj];
' @- a3 \1 R# t. f. K8 y1 i7 a }
" v$ @! q9 ?+ j5 D% x
* ^; {' ^5 j* s7 X for (size_t jj = 0; jj < vec2.size(); jj++)* m3 z& {. i6 ?* w7 j
{6 `5 @1 C [ j( {
b2[jj] = vec2[jj];
( B2 }" q( U, c9 k0 h) G/ k }, P6 [) ~/ i& @, W5 p0 F5 w2 H2 i$ W
4 Y; k5 k7 [% y3 p. u. h //Method - 1 N=100000 247s
0 K9 y/ T# v ? //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
5 s2 J. J0 W. y( t/ k
8 B0 ]0 H* ^7 o6 Y2 \) ]% F! x% X //Method - 2 N=100000 237s) t9 q$ z3 H2 B; M4 [
/*' F& L" I8 Z9 l" M6 F5 u. n
for (int jj = 0; jj < N ; jj++)) s; o: [% ^! M a
{8 m# c' G% }$ H$ g
fresult += vec1[jj] * vec2[jj];; \+ k& [3 ^+ E% i5 S
}+ F1 Q/ ]; K& l, F2 j+ w
*/
9 z: |9 K6 |/ v2 v% U. ]! f
+ ]# z6 H0 S+ |* _% s //Method - 3 N=100000 204s2 g8 K& P' u H- I6 ?7 _0 n
/*: i, L) s& n0 N7 x2 ^
for (int jj = 0; jj < N; jj++); }) v2 q4 U9 i3 y
{2 N( ^' _# t8 ^9 o% n4 M7 D
fresult += b1[jj] * b2[jj];+ m }& [$ N/ ~
}
- y- z% G7 D& j9 w% o P */
0 ~9 k- m# |5 R7 c( l
7 F' ?% C! l2 F' X, k1 [ //Method - 4 202s
) z% ~& X$ s* a /*) c& M/ l+ t0 G* {4 N9 D) \
for (int jj = 0; jj < N; jj++)
5 Z% O7 Z8 G# k0 B {
0 i1 R2 W# R5 F/ j3 H( ?
/ _2 @5 f z2 O0 j& u; k( c$ \ }0 r0 E9 O' k0 ]1 X1 v& t+ f1 c
*/1 ~( ^, ?( A# r) @7 B; {
//comment out all methods, N=100000 202s 6 m8 \9 p) y: e g- A' Z8 v
}
5 V3 B% e f8 i) e l- `. _
! S) A9 h4 V/ [6 ^ delete []b1;% `3 v Q9 M1 g' r
delete []b2;
: x# K1 U2 Z7 `6 T9 w3 o8 f7 p |
|