TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; ^, T; H9 s/ `6 H2 ^' R a
5 f8 H6 w( v9 s1 s$ I& g1 Y理了理思路,重新做了一个测试。
& {# q% h4 d* N4 }4 O& u做了两个 vector 和 两个 float *, 都长 100000( B. ? E8 d( s, y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 T- t- Y3 q, H' F
' n0 j% ]/ u8 w# ~3 B
内循环试了4种方法, P$ T1 F2 P& e7 J. f: ^4 C- z; x
1. 直接调用 vector inner_product 247s 7 n/ W/ x# Q& i+ l3 m& Y9 V
2. vector 循环点乘累加 237s
" c9 ]) e y. ]& R$ i, a9 W( I3. float * 循环点乘累加 204s5 V4 Y* F% C' u6 F* h5 {
4. 空循环 100000 次 202s' E2 x' y5 Q$ X9 {9 i
% w+ R% s+ g+ ^
不做内循环 200s$ c6 w) K, g, s) j1 e) ^2 j
- m- B4 y2 O, z" W6 i, k4 |! n# M你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ i8 Q5 l5 o: r& f' W) O另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; A% @' Q* o9 N& m+ ~
; O8 c1 Q4 P" c+ I
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( v9 P5 Q3 D. f7 i/ v' e
! B& T3 A2 c' c4 B7 D2 s(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
3 X% E. g7 d4 W0 z' _6 C
q9 N6 r& K. r2 [ std::vector < float > vec1(N);# e6 d& a* |. f1 R0 ]; q
std::vector < float > vec2(N);! S& k$ m. ^ @$ {# l+ Y( h+ @
float* b1 = new float[N]; B( c+ N/ V. V+ v/ S- ^& \. V4 j
float* b2 = new float[N];
7 a. f# o, W) r2 l( @. A4 n8 O9 { r1 x' `: \6 p6 C
for (int j = 0; j < 6000; j++)4 O" q2 ?- {6 L$ K
{; M& u% j# g) Z! L; S
std::generate(vec1.begin(), vec1.end(), []() {
1 y# z% {' E7 }, Z8 H1 g return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 S( U3 ?- g& O* y8 q. [# c
});8 I+ d5 w. _+ R- F/ J2 U( c2 b
7 v5 A" X1 ?, c- n
std::generate(vec2.begin(), vec2.end(), []() {! L7 d0 p/ P& ]8 B5 X
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# O X0 r: Q, }% j3 r) `8 w" M
});. i8 x* ]) c" o( p8 J) L( Z8 A
, m# q4 N/ A8 k& v2 j" W# ^% g3 T for (size_t jj = 0; jj < vec1.size(); jj++)# G5 q! r4 v* A* h4 g4 z T j3 m( w
{
2 O. W7 f/ _1 E; ~ b1[jj] = vec1[jj];
# D( F* q6 W- _ t/ m: P5 L }! ^7 _+ p; g: p
! @% O# ?8 \6 I: {9 z+ a0 B4 r
for (size_t jj = 0; jj < vec2.size(); jj++)
! J* r1 n& {7 V) Q9 p1 { {
5 A% L7 u- ~. o' D7 o b2[jj] = vec2[jj];; B1 Z: f$ l$ U
}
4 b7 }/ K6 F* l8 o* n- F+ h) k) e% b) M7 d2 M. ^6 [
//Method - 1 N=100000 247s
. e- x* q0 T( }9 E2 ]8 m0 {. t //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 X& E! Q! M* h1 h% F: a0 r
4 z! S2 g7 f! d) L6 X: |
//Method - 2 N=100000 237s
! s; H1 Z+ y. W, g/ n /*
7 f9 T* y q! Q for (int jj = 0; jj < N ; jj++)* h7 d# h( F! Q% C, z
{
_$ n0 g) s$ |$ n fresult += vec1[jj] * vec2[jj];
; O' X2 `( i1 D( c }* u% ?3 O2 b. U. ~# D
*/1 y+ m# n; `/ M9 `
# y4 ?: w& h, f1 E5 K( ?; i //Method - 3 N=100000 204s
$ W6 l1 P' ` N8 j /*, H! f5 r5 b& U
for (int jj = 0; jj < N; jj++)
9 ?, W+ `2 G) s* |# ] {6 A6 }9 C& \& F
fresult += b1[jj] * b2[jj];2 P" S; ~* n: a# D4 X; S1 \5 j* |1 _& X
}
; _1 n" a. y" N. k1 k */
$ F0 a1 ?( [8 n/ M# V' }, Z7 j h8 g6 d" [0 m
//Method - 4 202s
& `% e; o7 b V/ R" v; u /*
/ G$ g$ H Z. x' o0 ~ for (int jj = 0; jj < N; jj++)
! x( ^. I; S/ ]1 E# N0 F {1 a: U: c6 [/ G4 \
; u. b2 R9 H! m ?8 ~! M6 ]
}. o/ C K; t! m4 {# W
*/0 H" z& c& D& Z# ~6 }
//comment out all methods, N=100000 202s 7 y, M' `% g$ n
}. [) Z2 W8 O6 T: N
( x4 o5 e% o: g& ?, t
delete []b1;' J) [% P0 K. Q
delete []b2; 0 p/ y% `; W# N) ~$ R
|
|