TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! f! X' }$ c/ K* G
3 H, ^, \, o1 Z8 x& ]理了理思路,重新做了一个测试。
- B2 K. ?0 c- }' v0 ]" O7 S H做了两个 vector 和 两个 float *, 都长 100000+ }9 q4 ^5 O) ?7 L% _* l& i! `
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
8 H# m3 k, k% d3 q3 k U# U
' h5 Q- w% I- }8 }/ t3 z9 [. ?内循环试了4种方法,( x$ U- r" C; U g* h7 j3 P
1. 直接调用 vector inner_product 247s
" o+ l2 x. J& ]9 V( _; u9 y2 Y. ]2. vector 循环点乘累加 237s
1 X- w4 \5 M- h9 w3. float * 循环点乘累加 204s
6 b. i0 w& O2 M4. 空循环 100000 次 202s* G: j$ D5 M. u) e* O# P
0 V/ o$ q. e3 B/ Y不做内循环 200s+ o% |- L3 F9 B g5 }0 w* ^
0 Q' a3 R5 R: k6 L9 `/ A. j* d你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ |: q( C' N- }* f p- L" e; \
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- Y- _2 Z- r9 T* r( b3 _+ e! x
* D* j2 E: ]! g7 ^; [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
' u8 w2 z( ~9 d7 \
& V8 W" P$ {' ~% c7 F Y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 s3 G" ]% Z' x7 ^7 R9 Z/ R p! X1 R, ^0 P
std::vector < float > vec1(N);
1 r; Y5 o% B6 J6 V$ E2 n' n& n8 G6 J std::vector < float > vec2(N);
: _5 g0 M8 V' R( Y3 H" v8 A/ ]. [ float* b1 = new float[N];
8 o( v* l1 o. t6 _8 M' {+ J% E float* b2 = new float[N];. M! l3 {0 Y7 [. U# g" Q8 [
7 `7 m5 Z7 R( X4 M* x I for (int j = 0; j < 6000; j++)
( @$ Q8 b1 s* j, J6 c; b, I {
: O& C, d/ h: l8 t1 u$ Z3 @) L std::generate(vec1.begin(), vec1.end(), []() {7 d( N0 d; _% I- S* a" |: c* r
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% ~/ n' O9 C5 e% m( z' ^
});, I" E# Z4 v" q( h3 H+ I: {
+ ?5 `3 B6 v, u& ^% y
std::generate(vec2.begin(), vec2.end(), []() {6 k$ k2 a/ E2 }
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
5 s2 v8 e& ~/ s" }8 k# J });1 Z! L; a- \( ?0 U9 ?7 ?& Z
6 q4 K9 f( |0 c) E
for (size_t jj = 0; jj < vec1.size(); jj++)8 n7 L# P( z2 |6 Y
{
2 ]) x9 T; |. l+ y) v" j. f b1[jj] = vec1[jj];
3 O9 k/ Q C9 ^; _# F }4 H0 i9 T6 a4 y' H- ]' Y
9 i" J' }. {' `# x4 }2 b' s( e
for (size_t jj = 0; jj < vec2.size(); jj++)
* T* a; P: R, \# a. I {2 r2 B2 p& _* R: T e
b2[jj] = vec2[jj];
( a6 M# X3 ^% M. g' X$ Y8 Z3 A+ A }4 y3 j7 W5 ~, ?/ Z4 m
: K$ h2 L* R3 K, O* d ~. ?: H4 \
//Method - 1 N=100000 247s
: R8 ]) ]$ @5 c0 d //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* d4 Y& B3 ^. b& K
: a. V" J1 r. o7 @
//Method - 2 N=100000 237s( e: x( c i2 G) |% T( N
/*; C, l6 j. ~9 R. w0 t
for (int jj = 0; jj < N ; jj++)/ V0 r- E5 W# L5 @9 M
{
- [7 I6 R6 u$ H) H6 W/ g4 T7 q6 H fresult += vec1[jj] * vec2[jj];
+ g) @9 @. s* }4 U5 M, E. f }
! m% l& C* U6 K8 N */
' y5 j& y$ b5 h* ] ( {+ o# y k5 h/ t
//Method - 3 N=100000 204s
) L& t8 \. x8 ]. o /*
# w; C6 y, w) R1 u. p4 X% D for (int jj = 0; jj < N; jj++)6 d& |, v5 q$ Z- Q t& G J4 s# }
{
# s- Y i- ~. N6 h fresult += b1[jj] * b2[jj];
0 f& [; t& a' ~- J( b; C* e: H& w4 P }7 C8 `* k) f" h' V# |, |
*/
o4 @! F7 Y" r# [8 l8 m+ z8 K/ R6 U7 {* A% l+ J" n$ s" r
//Method - 4 202s6 r& B) b: S" |8 A0 d- r
/*, N- _6 {6 | w5 K$ j
for (int jj = 0; jj < N; jj++)
9 f( P$ m. x9 Q7 I9 h {
4 F8 y) S+ a- ]# ^9 D * F$ o) Y) J/ v; d$ J$ A
}1 A7 _1 h* U2 M9 {$ z0 i
*/
; h1 ]0 t2 z6 C1 z0 F8 D //comment out all methods, N=100000 202s
7 k4 l! e8 m" U3 l$ s' E }
) R" Y5 E. ?- R
1 U- o' {" X \. K C) [. g3 X& w delete []b1;
. R6 o, m, r& }3 h8 T delete []b2; 5 ?' f" `2 M) S
|
|