TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 k& V- o0 M& [8 _
! G. g4 Z7 q t( A理了理思路,重新做了一个测试。6 |9 j1 g8 P! O2 Y5 \& v3 I7 Y
做了两个 vector 和 两个 float *, 都长 100000
( z+ A2 @8 E- ^- O+ B0 [' {: E外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' ?* x$ }" b+ I
, z1 P- H; {4 t) g0 r* ~
内循环试了4种方法,# q; P# R& E: p/ C5 `! T1 z
1. 直接调用 vector inner_product 247s
- v" Q; g( A8 g5 L% A' o# e+ J2. vector 循环点乘累加 237s, Z0 a9 r6 y/ }7 s4 p8 p+ c2 s
3. float * 循环点乘累加 204s
, O& b3 I" H3 S( x& i$ |5 k4. 空循环 100000 次 202s! P t/ Y( ?5 L# `6 D
$ `1 ?2 L- T6 z; b" [不做内循环 200s- y( O0 G) |3 `$ r4 ^# [) D/ y6 p5 N
/ ?8 a$ ]7 V' e8 o" s你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( e2 v0 a3 \" v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
5 ]- r8 ] V4 r- m8 w! {2 ^# h z: e# {6 p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) t+ I, v# D+ W; v' n. d) b
& G9 U8 ]7 @ ? h1 ?(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)& P7 W5 G- C6 p0 a9 Y
) ~& Y) x) Z* x* [9 T) g std::vector < float > vec1(N);
9 M1 E# Z2 S& I7 s8 r std::vector < float > vec2(N);1 R; n0 z( U* D
float* b1 = new float[N];
4 X* c9 b6 D2 m; I: T3 d float* b2 = new float[N];
9 f" T/ s g# }6 A+ r; ~
. z/ d3 B6 j) W' f5 a for (int j = 0; j < 6000; j++)& n- R1 u) Q( D w) r, u- a u
{
' v: r% J" }% N9 b/ w- P9 e) t std::generate(vec1.begin(), vec1.end(), []() {8 i1 _$ v2 P3 e8 z0 p, H
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! R$ C- }- x: _* w
});3 x' H6 V' B1 ~& ?( Y; t! f' X
# c8 |, r' m0 j; |& ^ std::generate(vec2.begin(), vec2.end(), []() {
2 a! T4 J4 w- d) { return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 }$ z4 J1 W7 ]1 b& a2 ` @ E
});
" M' x: D* e7 D5 t* b8 N# H5 S& p
" `4 N3 B( Z, \2 y0 o, w5 s( @ for (size_t jj = 0; jj < vec1.size(); jj++)
0 n( W. Q; w3 T8 R4 s {
& Q, {& \8 Y0 F) d0 p: c! s b1[jj] = vec1[jj];& s% v/ G. b, A
}
& p; h; Z8 Z& |' K5 f0 p; U/ k4 }2 D' [' E# F' J
for (size_t jj = 0; jj < vec2.size(); jj++)
* l2 A p$ D+ p0 |' z& K {
/ |8 C0 n2 h, i. r* D9 I' g6 Z b2[jj] = vec2[jj];6 Z/ o9 F/ j# ]3 j4 C
}& K D" a( L2 h- f3 u
/ B! X0 ?; a4 P, r' [ //Method - 1 N=100000 247s ) W' `, p5 T; _. D% J
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* N4 M3 W# @ j: j# H
2 N# }# J+ b0 P
//Method - 2 N=100000 237s6 t& s3 I) f! @% X3 l9 l5 c
/*9 B" n/ m% F3 c* ?, ]7 Y+ m" Y
for (int jj = 0; jj < N ; jj++)
, i- y2 p/ I, f+ Q5 @/ h+ u ] {5 u$ A% x6 w$ M9 i$ r
fresult += vec1[jj] * vec2[jj];
# C: b/ u, d- y! }2 D }+ c6 g' Z3 ~! _0 e8 c5 g7 H
*/
$ x1 y/ G/ n; ?4 u2 \, B0 g / g7 y2 x3 [7 ^! |
//Method - 3 N=100000 204s$ I! e# G$ G# ?; U9 D7 X9 R. j
/*, H4 Y- z: T, I+ d) `& Z
for (int jj = 0; jj < N; jj++)
4 _. |. a K' Q1 n/ N; Y5 s1 \ {) g1 B) Q+ f* a x3 w8 D, p
fresult += b1[jj] * b2[jj];4 H q/ E, W$ q5 d
}: |; N$ m4 {8 u2 t. G! e
*/
2 l' T6 W R5 r5 c: J8 ?
W% h% I( ^! w: Z, n# R, Q& z/ | //Method - 4 202s+ Z' J7 N6 G7 x9 p P; Y
/*
4 ]6 y( ]) l8 ?- _% Z8 _ for (int jj = 0; jj < N; jj++)1 D" T' ?9 Q& S
{1 ?6 d* y" |2 P- M
' n7 a& I' v7 Y$ H3 _+ K, O
}
! F) U! _) ?$ k! \* X0 Z% t */
2 G3 }" d7 O/ G9 B1 u! _ //comment out all methods, N=100000 202s / U/ A$ y) `) E9 ?
}0 X' Q" ]8 c" k) M# L- S
9 d8 h( x2 V7 c delete []b1;' g& `! T/ [/ P2 E% l3 l
delete []b2; 8 c6 A) x) e1 @) L, V
|
|