TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) M+ y! O0 f" }# ]: w7 a+ s
! L) {" G: O' F+ n0 x2 p7 h! ~理了理思路,重新做了一个测试。! a" {1 x& |4 I2 O
做了两个 vector 和 两个 float *, 都长 100000! G: l* P) d; M5 ?" i9 a. ?
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
1 o% K9 N. Z$ }% s
' y4 q- F: b) ?8 u m内循环试了4种方法,
" `9 I# M# ?/ P/ k4 i7 y* @5 o1. 直接调用 vector inner_product 247s % y3 g! k7 g3 ?1 }
2. vector 循环点乘累加 237s3 J _4 R, J3 b4 a% F h
3. float * 循环点乘累加 204s7 Z% r& Z3 P6 U1 Z
4. 空循环 100000 次 202s6 O- I0 M4 p( U/ C
: o( y% ^' f L; n) _5 Z2 v
不做内循环 200s6 Y# n n5 l, c0 Q: O
4 q8 \) t6 e4 U) P( X5 R4 |( k8 g7 B你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ U2 u/ g# q' d3 R/ I' ?, R
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ {/ J) [4 @: R! I
) A& ~( |0 |' f# k, U! B$ v至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" T( y4 k! A; ?: F9 f4 O
* v# {2 f1 H# \(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ p4 e- N% |1 m& y' p2 Y$ y0 E
# [& Z; e7 k; ~
std::vector < float > vec1(N);& ~0 @- u, o" R( n& z
std::vector < float > vec2(N);1 k5 S3 {1 x# ~( j% w U
float* b1 = new float[N];
& O$ p; k: i% ?6 q( D; K7 D* E float* b2 = new float[N];
5 G5 N2 p# I5 X" q ?' i" c* e0 b* U5 `2 k
for (int j = 0; j < 6000; j++)( p3 J+ K: L, a4 H) [% r- r2 ~
{
' j/ C8 E2 I& ~& s L std::generate(vec1.begin(), vec1.end(), []() {
8 ~( U, J+ ~$ y; x9 N6 W6 V$ O return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. W% y/ u! {+ q4 i" _4 a6 x* K });7 r, ^. @& f6 P+ z
1 D4 I3 E0 D |) y3 w# X' }: A- t std::generate(vec2.begin(), vec2.end(), []() {8 S" ~$ h. i0 E1 R Z2 v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ T# V7 B* l! ~7 V1 s( T$ y
});
9 n& C: M" Y+ d: N; @% [1 |8 f3 _! m& C& o) ~' s
for (size_t jj = 0; jj < vec1.size(); jj++)
2 |; P# S- a* S5 j& F" i {( v# z4 d; c* u# f3 ?- N, X9 w6 r f
b1[jj] = vec1[jj];
0 [- K0 A2 A6 g6 ]- V2 z% m }/ a" ^: S* }$ n; H. p+ R' u1 D: X
3 s+ h1 i- M, d( r. L: d for (size_t jj = 0; jj < vec2.size(); jj++)
) H" \3 ]7 i) p% ~( ~) @1 q9 P {
# D0 I+ A' v G$ G b2[jj] = vec2[jj];
4 m' c6 ^0 T3 h% E& ~ }
; }: s# r7 O' U: m, Q
4 w; i9 h) `# B: w //Method - 1 N=100000 247s 1 g9 G2 {- u4 V% T' P% u
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- V/ w$ }+ j& Q" Z7 s: W , c" |+ T' e+ y% A" o$ \6 t
//Method - 2 N=100000 237s: Q9 w7 E. g% D
/*
4 G% K1 }9 O' G for (int jj = 0; jj < N ; jj++)- x! c" o$ N& H
{) N c; @0 l1 j4 S/ T' H/ P9 K
fresult += vec1[jj] * vec2[jj];
# n2 z; a( \& B# Q9 F1 Z! d }: [5 j- T n2 c
*/" x( T7 _+ V* m1 |
" b* h# r% }- `4 b7 V0 T# J& i //Method - 3 N=100000 204s
7 h% o9 K3 {# I% L /*
P% u# f% u1 r for (int jj = 0; jj < N; jj++)( ?+ f( N0 K# N2 W* D
{6 S: z: e1 Y' @: I0 L
fresult += b1[jj] * b2[jj];$ b7 z: Z9 d/ c1 O
}
/ N+ W- T' e2 V9 Z1 d$ {2 t6 P, Z' H */+ A) Y8 q" e( V, Z- O; _
- d/ m5 f' R: M //Method - 4 202s1 [' b' X9 e. [' y. F
/*
/ [- S- B) C' M! r for (int jj = 0; jj < N; jj++)
0 j$ b) i' Q" a( J, L {
5 H. O! g6 k$ H! C/ h
: ^" H8 \) @ R' V6 t. i8 _8 d }% W8 w4 m$ r, Q8 F. m& S" Q$ ]
*/* \/ O3 O: N: P8 @3 {! D$ `
//comment out all methods, N=100000 202s
* _/ i6 }7 O4 M5 ^ }
. }5 u5 y5 y8 {) }3 Y* F+ u
' K T, a. k5 n0 K+ p9 a7 ?, K delete []b1;
Q/ _+ a: [( p6 D+ [1 M% y \ delete []b2; 1 I% ~- o( Y* x( J, F" k
|
|