TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 [2 p( g- Z9 c( r
. r- R+ q% z( `5 ]/ | [理了理思路,重新做了一个测试。
/ O' D( m" a+ k, J. _& a9 q# v做了两个 vector 和 两个 float *, 都长 100000# X9 f7 [8 W) G% U0 K7 R
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.% d2 ]& B9 ~1 H6 B
) h: f" k2 r) T1 ^0 e$ [- ~
内循环试了4种方法,! o( ~6 i; `/ T7 ^
1. 直接调用 vector inner_product 247s
}8 M$ y; g% x5 ~1 j2. vector 循环点乘累加 237s
}! \! |& L; a% j- g0 q" Z; g3. float * 循环点乘累加 204s2 F% Q0 w- b( W. V* e
4. 空循环 100000 次 202s
: f3 M5 w3 X. V( R. }) S5 L0 C
; L8 h/ z, M! u4 F7 K; P不做内循环 200s9 k3 \! b, G! ?8 z
" @6 h, O. ?6 w3 y! A5 }2 T; P( n5 S4 @( Q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。% ~1 J* }+ Z7 F3 {- n/ J1 G7 L: S' ]
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 J7 E" o4 Z2 N4 s: N6 R
0 d) u, g% P- g$ M. S; w1 a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( x: w; @+ e" I" p
2 Z! ?1 s8 L( b7 M7 f3 ](为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 W; m+ j9 f. J; i2 a! g
# O; j L6 |8 a3 d3 a5 B4 _& L
std::vector < float > vec1(N);
8 k5 ?" \/ {! u# u9 A% H7 v& Q" z std::vector < float > vec2(N);
* |# }1 i1 `; o, L' {: ?& d float* b1 = new float[N];* z; E; @9 t" R
float* b2 = new float[N];
) P R7 V- c( L
$ y, j. N7 m. T4 } for (int j = 0; j < 6000; j++)
* U! V- Q- l. v8 S& E7 f {: A3 F+ I5 F' l- ?% ~! l
std::generate(vec1.begin(), vec1.end(), []() {
1 f) ?# r9 R1 }; V3 e( K; u. x6 E* ]3 e return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;& a- P7 d; ~1 m
});
" q$ ?3 \8 o3 _) Z2 E! _& B7 g1 a& j+ c: O
std::generate(vec2.begin(), vec2.end(), []() {
! g& D: y5 ^) d, g8 ? return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 Z9 \4 c& u, B
});
2 E! f* v' X' _$ J$ u F( L1 n) W: z9 t% |# D4 Q7 @% [ }, J' C2 O
for (size_t jj = 0; jj < vec1.size(); jj++)0 q9 h7 K6 a" m8 S6 v* I
{9 v4 c& O% ^. w9 ]( h
b1[jj] = vec1[jj];
+ Y+ C: r' w9 k1 N( l }
; Z! O# C' f9 B) B; {4 w8 Z5 t A/ v" d$ T# z; R; R& W
for (size_t jj = 0; jj < vec2.size(); jj++)
. P0 q4 p, O" k5 y% O, i {
- \0 H3 v, V* i0 v% a# a% a1 U b2[jj] = vec2[jj];# H0 D* [$ I- G/ r0 o
}
5 b8 Z# u8 r) _# m$ X6 u, w8 K( T3 i
//Method - 1 N=100000 247s $ f/ S6 I& b/ s* p% @
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 P( [6 \ h% B# d4 F+ S" S 6 m0 o; z5 Y& N0 w+ p' j E+ `" Z
//Method - 2 N=100000 237s
1 U2 U( z* S- k. f /*
& X% M* J0 W- Y/ s7 P. {/ h0 V for (int jj = 0; jj < N ; jj++)$ L/ D% a6 i) v- k9 S
{- u$ T" w4 h* K; x. K3 {
fresult += vec1[jj] * vec2[jj];
! I: X7 T) m4 a5 X) y3 e }
: K9 c+ `% Q' F6 S! a! p! O6 S, [ */
2 j3 h# l/ p3 a5 S8 a5 Q
3 |" H+ U" d4 n; ~ //Method - 3 N=100000 204s
/ a7 {/ f9 O; l8 } /*: v3 \, H3 j; v; M
for (int jj = 0; jj < N; jj++)
Q5 A5 h4 R) Q6 `- e) |! \/ S {
0 \- T" x, K1 z$ m7 V; e fresult += b1[jj] * b2[jj];! S" J- h3 O+ T$ O' v
}
. f: X" n4 g2 I" }+ Z */- j, ?4 s7 f Y" N, l S
+ L! k' n5 |3 o) V
//Method - 4 202s
0 V8 N4 y# V7 X, t! \2 P, g2 N /*% o; I2 ]. O/ N" m7 z% L! M% c
for (int jj = 0; jj < N; jj++)
) d/ ?3 P6 T, Y' M' G& t {4 m3 i- l; ?1 e' r( @
- x! C9 D0 I8 a+ }$ R6 n% J' S+ i }6 T) c' k! H" ?' p M
*/% z: H2 `5 o1 c) b: ~
//comment out all methods, N=100000 202s
: D$ c' ]; c6 n! g9 a }
+ E# x4 A; T9 I! U
4 I- d0 |" O, }6 E n delete []b1;/ r( O& e, |5 w" }0 }' H
delete []b2;
( |$ ?7 l/ M- u# K; j% P |
|