TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + w7 E4 `- D5 F- V
/ t" ]; i" F# |. J" K7 O# X# b
理了理思路,重新做了一个测试。
# g5 K# {8 y, o4 N7 i做了两个 vector 和 两个 float *, 都长 100000
* x/ @0 d2 ]9 _! v) [: y& n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 W8 k1 L9 Q" s5 Z. P
2 U, _9 k( ^( r* [/ ?$ _内循环试了4种方法,
" z: L& n. }* X& H1. 直接调用 vector inner_product 247s
4 m# g: ?% C8 J1 j ]2. vector 循环点乘累加 237s
! p; m" ~. V! ^3. float * 循环点乘累加 204s1 Y! v, b5 L5 ^5 t0 ^, |
4. 空循环 100000 次 202s; Y0 s9 I& x" o* x' c
2 l2 [" S8 F ~. j9 z$ s不做内循环 200s& ^( b, `3 j# h! x$ H, p
* B) C( k! @" [$ ]+ A4 T
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( y2 @1 \: `2 b( V: |4 a另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 O/ k; \ l1 T3 n- U/ F
/ Z% j7 a1 A9 f) Y& |5 g9 f
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
* @% w5 V: O. r: V1 C3 c& g) p8 m# |6 ]9 V1 a6 L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
3 Y1 U0 e2 U/ e6 }7 a! `5 i
4 I: C- ]. B( r5 i2 Y std::vector < float > vec1(N);
# ]0 h- M0 a. A; a4 Z9 x) {& m std::vector < float > vec2(N);
* ^( [) @) M3 @, @2 A3 A float* b1 = new float[N];( F6 S3 Z; D6 p+ d# A8 y
float* b2 = new float[N];
6 K& W) P/ N9 N I0 W* t
' z$ r$ h" c* B* m7 J3 c for (int j = 0; j < 6000; j++)
! R3 o7 g- X* ]) f* Z {
; V/ j0 d; X, ] std::generate(vec1.begin(), vec1.end(), []() {
2 i9 C% R" e8 R I: @1 ^9 U return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" g6 u; m$ ]6 b4 `3 y });
0 p+ M$ Z" s0 @* r" A5 [/ `( e
" w) C. M' R" F) l std::generate(vec2.begin(), vec2.end(), []() {
" k5 f! S; }4 Y& ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 j- W [# j0 g, z! P+ S
});% ^) {; j3 p' J0 I* B
7 k Y+ r5 }$ H. @3 M; m# a. n+ R( v; Z for (size_t jj = 0; jj < vec1.size(); jj++)
6 |/ P3 v( E2 _1 m {
- a: Y* j+ j3 |' M! f" B& O b1[jj] = vec1[jj];
+ P1 B' t% V7 }: y$ s3 f) S }' M; g) V; _0 k! T4 F
/ g% E* a0 X. I" \ for (size_t jj = 0; jj < vec2.size(); jj++)' _* ]0 a# }. c5 Z8 |. M. G
{. ]0 }& W+ N* p, w4 \' t$ G
b2[jj] = vec2[jj];, S# c( b6 l) d; V3 x* R
}
- x: d' k1 g6 l4 j" ^0 |
- X: j) L3 @: ]8 V S. X //Method - 1 N=100000 247s
# {9 G1 d/ \2 N //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);% U' A% H8 d4 U1 W; {$ r7 ~) }
7 _) h8 Q. t7 @5 w5 o% i( {- o1 h //Method - 2 N=100000 237s n9 n- @4 X! z9 ]6 r2 s
/*
- Q2 j9 |8 U- k. K, q for (int jj = 0; jj < N ; jj++)
$ D! {% P' Q6 Q6 k7 O {
# K( \& ^5 V/ s7 H/ O( D" S' g fresult += vec1[jj] * vec2[jj];: d5 ?6 a) Q+ F" D' E2 K( U* R6 d4 u
}$ v; ]# |, P2 Y
*/
( W6 p# _9 H7 y. u9 ^
: c. h7 m1 x1 t2 L- @ //Method - 3 N=100000 204s. i4 C2 {9 M% R; T
/*
( J/ } M& d {$ F for (int jj = 0; jj < N; jj++)" @6 |+ \4 o& U( c) k
{
% B/ j8 K& w0 d: R0 l fresult += b1[jj] * b2[jj]; J( I, T$ w3 w6 a% Z% \. I+ }
}
3 b* V" a+ s+ ?+ m */
5 f& K: i9 T3 E5 M3 f9 v8 F' @
f, F4 p+ U# C; ~4 h$ r //Method - 4 202s
0 H8 k/ \8 t- \! |/ }& ^% L) [ /*
; E. r5 W8 e6 W4 X for (int jj = 0; jj < N; jj++)
! }% @+ ^$ N' M. b0 w {
, _" F. I# |: b& m3 G' p. D
* Y6 c( J4 i# s+ H) `: g5 G, | }
" | w* h( m d7 N% @ m/ v0 ~ */
% w! ^7 @$ F" K4 v7 y //comment out all methods, N=100000 202s + ?) }: a/ o0 [0 z
}
1 J5 B o3 p+ v% i7 B/ j2 j' ?! M1 Q1 K' X% y0 C$ p
delete []b1;
8 U T4 B5 k: L/ Q delete []b2; 2 f( s } J+ g3 L) c; R
|
|