TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
$ ^( c" S- ?. T% `! `
# S5 L( i. N2 k5 t! N3 J3 x: w t理了理思路,重新做了一个测试。1 j: q2 N7 o3 a! z( ^
做了两个 vector 和 两个 float *, 都长 100000
; O( v+ n7 U: s$ j; N9 ]8 e( V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! E/ W! h4 X% |! E2 P0 e1 ~3 u
! k6 X5 m; l" Z# C0 O) l* e3 y内循环试了4种方法,
/ `! f$ h+ Q1 m+ U1. 直接调用 vector inner_product 247s
' ^) y, i: M9 |# }; {2. vector 循环点乘累加 237s
: e6 y) ]2 l9 Q0 i( U' _3. float * 循环点乘累加 204s, M( z) ]/ |+ w$ t
4. 空循环 100000 次 202s
7 H8 |3 W5 |3 n: s @+ Q: q( V# A9 q; Z
不做内循环 200s
6 l0 D, t+ Q/ ^
* W6 D7 X* t3 A/ }5 N# f. Z你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 U9 j* ?6 u- C
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% A9 N1 v) _, I& ]5 X: D
( y) M! @: Q( P" M7 r3 t
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 E( }, U2 U9 v& Z, E' { s
, m y- F1 [ f(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 _/ w# _5 l, p% J" U1 v
7 e+ j' r9 r0 @9 B std::vector < float > vec1(N);) Y% w0 F, @) H7 r& x
std::vector < float > vec2(N);6 |+ q# w3 F0 V& w1 x" P) Q
float* b1 = new float[N];
# z3 {: h+ j o" _, u float* b2 = new float[N];* O. h$ T7 q/ ]3 q
+ {* R4 x! V. O; K for (int j = 0; j < 6000; j++)
, L* Z8 e: h: N$ d6 l {
4 [. K" M; @; x std::generate(vec1.begin(), vec1.end(), []() {% a3 \) }. Y6 N* P( K
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' l6 Y! ]5 r/ |5 h6 V });! ]- m4 x' n. ^# `$ Y! [
9 S" _. R) V m
std::generate(vec2.begin(), vec2.end(), []() {
: w X* V: U" V9 G% G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( z" c* `5 ]7 w' h* s
});
; m' T9 ^2 }; C' X1 ^3 @
1 I1 `6 |+ M9 C0 Z for (size_t jj = 0; jj < vec1.size(); jj++)
' @5 }' x \4 n1 _ {" Y6 S, @, t9 I
b1[jj] = vec1[jj];
2 I3 g/ V$ w2 V0 A& }7 x# ] }
% b1 ^% M! L u6 }( m
' ~, _6 m* g i4 ?7 [" w3 n for (size_t jj = 0; jj < vec2.size(); jj++)* @. n4 v2 t2 W E% ]- l
{" L9 T& p4 a; m) e, A* D
b2[jj] = vec2[jj];
- T: a, ]. R5 }, v0 Z }! c5 I- A& A9 T; b6 U- H
5 M1 ?8 E; T+ ^
//Method - 1 N=100000 247s $ k' d% ~% i8 C" M
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ ?. D* `; Z' R% H
4 v6 _$ Y( r0 [! B% b9 @
//Method - 2 N=100000 237s
3 F, g$ D& A- v ? /*% G2 t' _$ c& w6 r
for (int jj = 0; jj < N ; jj++)
( G9 y) t* v5 P5 j+ Z7 ?, K {
2 d2 v+ j* V- N' d/ T: h fresult += vec1[jj] * vec2[jj];( k1 r' G' h& P, a4 m8 ]# q( u
}
- T6 p) l! C7 s0 U7 R( N+ k */9 }9 \% ], Z( W* t5 v
& i4 c$ r# U- ^- H I+ ] //Method - 3 N=100000 204s
/ H I, o v, ~ h; G- ` /*
. r8 y- o* O5 X0 y5 {3 \ for (int jj = 0; jj < N; jj++)
5 h) Y7 s5 l# H0 N* k( z I {
/ a! V2 E, V1 T. e0 z fresult += b1[jj] * b2[jj];2 i+ y( v: e1 J8 f
}3 j# P6 U7 u$ z
*/
; p$ z; h) R- _# v& v) I3 `8 `+ Z; E2 v
//Method - 4 202s1 X! c- G$ @9 C, K; d
/*( N, j' ]0 j& w: z% H
for (int jj = 0; jj < N; jj++)
7 F- Y7 y1 p9 s2 j7 O; R0 x7 v {
' q$ u9 B( [. u! `8 r! i$ I; \6 g0 e 6 Q0 X% d: x) Y( v; `9 I' j/ ]
}
& w$ p! n. X) H3 Q1 n */
: R9 h+ A' A: |- Z& b //comment out all methods, N=100000 202s
" Y& N6 I7 l: z+ P$ I* s: Y, i }
9 b4 F$ Y& {4 L! s S( g P% W* V$ `1 a w# T
delete []b1;
" M% W8 C ^9 K$ M8 U delete []b2;
) E% x5 b3 O7 C' P; m |
|