TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 @. q, H8 C; p p7 g& s9 n
7 \) J7 s* k R理了理思路,重新做了一个测试。- V, y* l8 q- U" ]
做了两个 vector 和 两个 float *, 都长 100000
- ~2 K: x2 g) A" U: o外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! j8 V' `, p8 n( O- n9 E! ]8 k1 \: V/ e1 U7 k
内循环试了4种方法,% j8 h2 X; `* t! X5 C! J+ M; x
1. 直接调用 vector inner_product 247s 9 k7 |$ g+ ]6 D- `- j; ` o
2. vector 循环点乘累加 237s e2 _: w! `/ o9 Y5 x( ~
3. float * 循环点乘累加 204s
5 E2 ~; b0 f9 F: p4. 空循环 100000 次 202s
6 n" Q v) ~; i
0 A; ?) V ~( t; Q6 S0 \5 k n不做内循环 200s
3 U5 A% p: @3 @3 V' E) S1 q9 ]: L/ A% `9 F! D* @- p5 H$ Q6 M/ K6 `$ V7 h
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 ~7 Y0 e0 `: k2 h0 T7 E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
$ s; O- g, R; Q
4 i1 \) s _. g8 p/ I( O1 u0 K至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 {/ x% s; p7 p- L
6 h3 v3 K0 t% q! }4 r `4 ^5 \$ q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)) A" `( t0 @8 ]) Z3 `
6 Y' G; |/ |) Z/ y# _; D( }, G* F std::vector < float > vec1(N);
0 X1 V0 K5 A0 e' _" ^. s1 B std::vector < float > vec2(N);
* b! G9 h7 K+ [5 G float* b1 = new float[N];
) R' v) ]3 _1 U7 W9 V. A* u float* b2 = new float[N];. A9 v3 V5 G7 v- U$ d) x4 I
8 O% {$ H/ I9 K. g1 ^6 N- d* U for (int j = 0; j < 6000; j++)
1 s9 [9 d; ?) l1 \3 X5 L5 | {2 z' Z1 U7 H& j
std::generate(vec1.begin(), vec1.end(), []() {
) F: B1 E+ K' l4 U return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
9 S2 f [2 A/ t6 p: p! w7 n* S7 p });
4 Q P& U' |8 G z; o
7 _1 v7 H: ]- d: X0 C' P$ I5 \" x* t std::generate(vec2.begin(), vec2.end(), []() {
* T( {; O( o! m/ g+ Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' C. y# k E ]9 n
});. ~. ~' ?9 W% M( f
4 I: v3 A1 G! c2 \- Q) ~% K for (size_t jj = 0; jj < vec1.size(); jj++)1 D0 v( B5 c/ c- J
{
7 Q8 `# C: G) { b1[jj] = vec1[jj];
) l9 B, U* w1 R) x6 w( e }
6 M0 L9 S i1 _' Z5 N5 [. _) w$ C, S. `; _4 y5 z
for (size_t jj = 0; jj < vec2.size(); jj++)
# r& }. i/ r7 U2 D {& g+ x4 U- e- n, ^
b2[jj] = vec2[jj];( F$ C( q8 k6 a R& a9 C, V$ A
}, n: P6 y; D# F+ A T
$ b! G$ F8 ~3 v+ o% K& A! [! a
//Method - 1 N=100000 247s
" s) {" k. @# ^$ X0 n2 d* k# f0 k //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
) s* B8 @0 }& w) u7 t- K1 F. L! I6 L! L
* d0 H9 Z0 I& k1 Y# \: F //Method - 2 N=100000 237s
) ^$ ^( ~0 j0 G6 h) _( ?3 ] A /*& | s0 T) j) _: y
for (int jj = 0; jj < N ; jj++)3 Y# h+ P" n( M0 {+ h; @$ i8 w
{
& S1 f5 ` _" v2 J4 _2 B fresult += vec1[jj] * vec2[jj];( B6 F0 ^) Z- k2 }% h8 _: h
}' a, u) e5 R2 e1 D) S8 g _& m! n2 F
*/" B2 h* N6 a- T, s
! y z1 z, p; w; R
//Method - 3 N=100000 204s
$ Y( C& a" [3 K' ~( H7 S4 ^ /*
. g( s( C: M! Q0 ? for (int jj = 0; jj < N; jj++), n/ P. M Y0 W5 A1 e" n
{7 c: ]# @/ K3 W5 b; b6 u& s
fresult += b1[jj] * b2[jj];
, y: W" p( ~ O# \' V% a }
; M) v% Q5 Y8 E3 L( X6 ?, z */
5 P% n# g& o$ B4 B1 Z, e4 z' n
" e# }. D5 r. P% I* u //Method - 4 202s
$ B4 r5 ~2 x) z: f /*
9 G' D3 a y4 R6 c3 k for (int jj = 0; jj < N; jj++)2 K1 T( g: b3 d2 m8 e9 q4 D' n
{- i/ x& z0 {9 T+ Y
8 Y8 F# d- O! H3 j }
0 J2 `7 y4 e6 v; g' M6 u6 M# `$ E */
8 s" F# `( B, V( ]$ K //comment out all methods, N=100000 202s ' `8 Y6 r4 R5 n$ L
}) P h3 l/ O( ]# b
4 T7 y) Y3 V( ~+ R- x8 y- s
delete []b1;0 T7 L6 u* f5 `- k. \
delete []b2;
% s3 }) t: p' b: U2 E! Z; r |
|