TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 @" u4 Y J& K& g3 F0 y8 U1 b. B* O
& o# n. t7 j' i. c9 ], e! W0 O理了理思路,重新做了一个测试。
4 K. d$ p9 T8 o" p% k; h做了两个 vector 和 两个 float *, 都长 100000
$ a: j7 b2 g6 S7 v* d外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
s5 i& o+ ?1 _8 ~9 r; v! S: K0 u3 I2 d8 b% Q3 h
内循环试了4种方法,+ T# q6 W7 ?0 L, c: X9 W
1. 直接调用 vector inner_product 247s V6 y) d2 t1 [: m# c+ `8 M9 {
2. vector 循环点乘累加 237s* _8 V h: k4 X/ o9 X4 x
3. float * 循环点乘累加 204s
, V1 @3 d" W# H0 r% \, x4. 空循环 100000 次 202s6 i% H; ]% o. A0 f) |
8 ^/ [" x/ X. G; {! v2 A2 `. i不做内循环 200s
% N. E9 A/ g( @5 a1 J2 F
|% e$ P. h& q1 K- p你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 P1 c+ M. @( n" W; n) Q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) U. V: j; c, c! G1 r) s7 H
+ Q' r" w8 B ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 R$ O: ~* D$ q- E* l5 E/ M
* n: W! h& k, u. S6 ?* h' [
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)# n8 I$ L4 b8 Q% {1 y) n/ C
( |& l$ k% ~% P std::vector < float > vec1(N);5 z7 J1 L9 a& ?+ f. h7 A! M% F; d
std::vector < float > vec2(N);2 j, d) U: E( {
float* b1 = new float[N];
o/ f; T( t" x5 P7 e float* b2 = new float[N];# V4 q" U ?3 x
! i W* s0 ?$ ~8 Z# D for (int j = 0; j < 6000; j++). i9 q$ `* e) o6 D# m, z/ W3 s
{; k* A) x; O- f1 ^( ^5 {5 w& |
std::generate(vec1.begin(), vec1.end(), []() {
4 M: V* [3 G. H0 ^ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 W @+ E! y4 a! B9 D! j* k- g, M });
1 x# N9 h5 a# ]0 J' d* r" i3 S& F& Y* U2 Y* U3 R0 x4 c
std::generate(vec2.begin(), vec2.end(), []() {
, g/ F5 ]8 I: {* T3 T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& ]; _* b! [: |- D0 ~+ A% ~ });
' `) _& M# P8 K% `
+ Y& U8 `% }+ [$ l- Q/ @+ p for (size_t jj = 0; jj < vec1.size(); jj++)
" r% X3 W! u5 X {
7 {2 M- Y k% I+ ?. w2 ~6 b b1[jj] = vec1[jj];
) V# y9 _2 M5 q: J3 ^ }
2 F* Z. L2 V. T3 Q1 }* y8 s# Q$ M2 I9 D7 D3 z4 K
for (size_t jj = 0; jj < vec2.size(); jj++)" s. l, l) r2 l2 J. C5 W9 n
{$ o0 q# u( ^* s, W/ X
b2[jj] = vec2[jj];+ Y7 b3 E/ e4 P1 x
}/ A/ D2 A" f- w( o; n- U$ b5 c
- V' e7 P4 m+ ~ //Method - 1 N=100000 247s : Y% K2 x1 S; o
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
p% X$ ~# j+ z$ I. I, P) n , Q- R8 ?- o- c& e" [. M8 k. c
//Method - 2 N=100000 237s: {) ~ L( Y5 V+ T+ x
/*. H4 z. A: B" s2 L5 P8 g7 s1 `
for (int jj = 0; jj < N ; jj++). g, J: V: ]: |1 B$ A' Q( L- W
{- R# n7 |8 \( }
fresult += vec1[jj] * vec2[jj];
6 K$ w1 g# N T. \6 l3 N }
9 w- H9 s$ F$ U6 N$ q. g */, G" [& d0 e1 P) {! s
/ R# G" S* M* \2 z ? //Method - 3 N=100000 204s
+ z/ j2 v$ D- `! J( a /*
% _3 O% v) J" S! `! Z: c$ j! {2 n% h for (int jj = 0; jj < N; jj++)
9 _/ ^2 |, E' ?$ c2 H {5 Y2 w, R+ w- {4 Y
fresult += b1[jj] * b2[jj];- K- H/ m( J& N3 V: f, d2 I/ [/ j$ G6 c
}
) y, T. w1 d2 s9 O */
4 N: w' ]8 F8 E+ \, N0 X+ N: J
( \ W5 L2 ?8 O! ]/ {* c/ c //Method - 4 202s' q: N$ h" f" U/ f7 H* G
/*
& |& H( g$ m |2 ~$ e; C for (int jj = 0; jj < N; jj++)
) d, z0 {2 k+ r/ ]( [ j2 q {8 ~. Z' t! @2 y$ _& _1 C! O
% R& f5 [5 J5 \- a, S1 M( T
}5 Q% |& ~' u2 a' j$ L3 \! P
*/
+ j7 {7 C- a. @ //comment out all methods, N=100000 202s 7 R! V! q/ J2 Q p/ j
}: ^( Q. }+ b9 W3 y
8 m( _, Z# F$ p6 l4 k; t+ J delete []b1;, v& R' K% U, Y9 Y
delete []b2; 3 G- v8 k7 N9 J2 b" y# V
|
|