TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, U V. {: j4 M- R' l- ]- k) O% l- K- h5 ~4 L
理了理思路,重新做了一个测试。
6 [3 j; ^# U5 L# z4 _9 o做了两个 vector 和 两个 float *, 都长 100000
+ P! i6 p4 u( @! q( S( O8 e外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache./ `3 G2 v1 y* G2 W( d# `* ]* B) L# i
6 s; t# T9 C+ v
内循环试了4种方法,8 H( R# V, @3 H9 v
1. 直接调用 vector inner_product 247s
3 a% V: c. \! c2. vector 循环点乘累加 237s) w* m- X. V! Y5 o; o; s0 N
3. float * 循环点乘累加 204s
* O' U+ {0 p1 U% E. k2 P6 i4. 空循环 100000 次 202s5 P' R. y9 S- t- L
. c( p/ u6 w Y6 j
不做内循环 200s% Y8 ]1 }0 q7 F ?9 A
, }' L% G5 p7 @0 [, x
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' N" r/ r k% X8 A& {另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
% p( t: X. g, A" E2 |
% `7 g5 o U0 i) f: l% ~* O至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% W( y. T0 _& m! T0 m0 g# }5 W6 H8 v. I4 R& r& K1 y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); A7 z$ Y: F7 I) Q
* n. ~9 F+ a+ d- s* n: i
std::vector < float > vec1(N);% |! d1 E) o" Y+ N, Y7 H6 G
std::vector < float > vec2(N);
) T1 _% ^6 n9 F! ~9 u- g float* b1 = new float[N];
+ F8 }3 r8 I) ^% U: l- t float* b2 = new float[N];+ u" o1 X8 a, b8 ~% {
Z `6 }7 L$ Q$ T7 d- ]
for (int j = 0; j < 6000; j++)
, ^" q1 F1 I3 |' I% j {9 ]+ E" ~8 ]6 ~) Q* p
std::generate(vec1.begin(), vec1.end(), []() {( R% E1 H1 T7 \9 j9 ^
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
|0 k2 X: X0 M* i9 v- u });
$ a0 T: G+ X; F& U& I2 H: {: t# \+ j e
std::generate(vec2.begin(), vec2.end(), []() {4 `* G- f: Y* U, R. _; b+ X
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# q/ @2 n0 Q7 J- J' L2 A
});7 U( I+ ~5 B! H8 W' `
1 K+ I8 ^# t0 U9 V- S) z( N) P
for (size_t jj = 0; jj < vec1.size(); jj++)5 L R7 G# m( L# q: x0 Z. f* ]. Q
{
) I: u4 S4 @6 E9 A) G: Q v* S b1[jj] = vec1[jj];9 i, \) b+ a* N
}
& N! Z3 |! J; w
4 H+ [; [) x7 a6 x for (size_t jj = 0; jj < vec2.size(); jj++)
9 ~4 n, A( @* w. C {
& H) g) N; m" w. t' r# j b2[jj] = vec2[jj];
7 S% l G, U7 j) M- o# U2 c }6 A$ w& o& t' l+ R9 ~, i; F" B- U7 v
- f- P8 v" K# @- O //Method - 1 N=100000 247s 1 q' s+ v& s0 P) b" \
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, g4 A3 x+ u3 S- g! r" q
8 f( h( z! [5 h3 S' g
//Method - 2 N=100000 237s
# Y+ z; R- h& L0 W) ] /*/ V6 V) d6 T c2 }& p
for (int jj = 0; jj < N ; jj++)
8 [; I# U8 U! v1 E0 Z7 `; C {
+ }* ~6 {5 b3 c fresult += vec1[jj] * vec2[jj];
5 I0 z) S; F3 G# c+ ~0 U }1 m7 d/ O4 ~0 ~1 D" z( Y7 [# h; |
*/$ [ G; `! h- E
! ]% v; p: y+ N+ ?( B4 ~
//Method - 3 N=100000 204s
. T4 a5 A4 i! Z) O# @! q9 c4 g /*
$ j# h* a. [5 s/ r for (int jj = 0; jj < N; jj++)) B) V" T. }; f3 C- T; V2 B U
{
7 E ^3 B. F( ^- T3 K) M. c' B# r2 K fresult += b1[jj] * b2[jj];4 K% g7 u4 E- K$ K8 W
} @' ]8 Q3 I* n7 F* r2 Q
*/
1 M4 ^! c8 {. C J" r+ Z5 g7 c0 x- V0 w. }) Q q( W
//Method - 4 202s2 J# k' ]1 z4 S1 x- N0 h9 [& A
/*
; ~: |" ^0 ?, g for (int jj = 0; jj < N; jj++)' i/ Z: v4 D" _& l& S
{$ j' f N! C# p% M
9 C6 G9 i( c4 x
} ?# R% @( `! E6 w4 [3 F
*/
% s C X, K; q2 V" A- {4 w //comment out all methods, N=100000 202s
# B* K) |0 R' V }
W" @2 [0 ~9 Z/ U( C \0 n W o( \( Y; E/ d6 X% h
delete []b1;
; B6 H: { U" i: g8 Y9 t) s# F delete []b2; 4 ?. O/ }, a. K/ }/ H
|
|