TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
3 r- H0 s. V( `2 q7 l7 A' |$ y- C! B2 I6 V: h
理了理思路,重新做了一个测试。9 n' [9 x; Y: E/ ~' s$ E+ w
做了两个 vector 和 两个 float *, 都长 100000
: }& e3 J" y2 F2 J% Y6 f( E3 a外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" f# L' W" A* ^* Z- _" {" q% k% U8 p1 r I
内循环试了4种方法,1 Y7 I# l( K! J( D
1. 直接调用 vector inner_product 247s 9 Y2 d* R) H2 s, ]' ^
2. vector 循环点乘累加 237s
: B) F% c( @9 [, z3 C3. float * 循环点乘累加 204s+ A: v6 c7 {/ O7 R! o; U; t! l; t
4. 空循环 100000 次 202s
! C& {' M# v1 z& }8 b% D- c/ y1 Q7 B3 Q
不做内循环 200s
7 X# _( j& n4 v' r
# e% W. D& } ]* X& r7 z你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ L+ g! j9 p- {4 _1 j# D7 N另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- M# j- @1 i0 C! U. i% l' Z
; w ~5 `7 K w* U至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
) g- g' F8 d! ?% ?4 ~' w& [
8 W% t$ A7 R" S8 O# k) k(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)' ^0 e9 V! V: ]: @7 r M7 A
8 R/ w6 {: {2 B% v- u( R$ H
std::vector < float > vec1(N);2 ^2 a! D! J0 G8 j& H* T) e# [8 o) Q
std::vector < float > vec2(N);
7 ^! b" F6 C9 \0 ?% ~5 t float* b1 = new float[N];9 F9 B. d& [- ~, X4 c% g
float* b2 = new float[N];( W% Q, U4 \6 q* ?9 _7 ^/ H) C
' D. T8 z! A# w% E% P1 F
for (int j = 0; j < 6000; j++)
- \- t9 _2 [: d3 q- n {
! v- m" [& {! R; j. i) Q1 Z- ] std::generate(vec1.begin(), vec1.end(), []() {
& @4 a1 R3 I; I9 `% H' e0 s \$ K return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- b6 r6 {# j9 S });, g; G- f g5 z) w! |
8 k; l: W# y8 X# D6 b( J8 W std::generate(vec2.begin(), vec2.end(), []() {- U* q# ?% T' [( V; g' v) u
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, o' I" \9 F+ b* |$ g( E
});
: `& w: ]" i) a8 j& d8 k& d! h) n6 j3 j$ V. u+ d
for (size_t jj = 0; jj < vec1.size(); jj++)
' V7 L" _% D3 G1 ^; |( Z- C( _ {
$ [2 v6 b- G9 O N3 ~3 D b1[jj] = vec1[jj];' O4 j8 ? o9 Q1 M! \+ F# ?
}, `4 @0 d8 \ k" y& b8 a' K: k
3 t$ H4 @" l5 v; k) r8 Q for (size_t jj = 0; jj < vec2.size(); jj++)
" q& C7 H/ R( H3 A3 C( C) J {
: t! t" H0 |, M W2 R: F b2[jj] = vec2[jj];" c5 ~" Q. @6 Y2 F/ F& B2 U
}
8 t$ ]3 Y: \- V5 P
# w7 W5 d* n2 L+ X* o //Method - 1 N=100000 247s
- R& k2 s7 b* I, y" k4 K //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
' ]7 {0 r, O# i2 i2 N+ V9 n + s1 v/ c, D. t6 i
//Method - 2 N=100000 237s! r R3 J6 L9 c3 J+ [" C
/*
6 ^6 b8 v' H% W2 o for (int jj = 0; jj < N ; jj++)
/ s$ L) h! v4 H1 w {
0 i8 I( H3 l! C* k0 X* }9 F( F4 N fresult += vec1[jj] * vec2[jj];
/ ^4 v$ V0 M8 j! J& c( v: L# [ }- Y2 ^: m9 N5 S# V
*/
* N) e" x) d a3 U2 a0 z) B
' |0 W+ b+ ?$ P$ {( v6 U( j //Method - 3 N=100000 204s
& ?: ?0 B% b! ?( {' T /*
7 H) o6 F0 k& ^3 }* A9 E1 X for (int jj = 0; jj < N; jj++)
: O5 y/ k+ f9 x1 F" b2 I {0 U s; T" L/ e+ K) H
fresult += b1[jj] * b2[jj];3 u5 Y3 O, Q3 W
}
% h5 Z2 c" J1 j */
0 P6 h) O0 ^* S0 w/ y% C4 J- D, K4 r9 \2 B3 e
//Method - 4 202s
( V( T# Q5 e+ B* q /*$ K* s# {$ b2 w% j& e
for (int jj = 0; jj < N; jj++)* O4 ?) N. U; x9 f- Q
{- z+ k5 F. G4 S. | z
( o8 l8 k |. O' w7 R0 Y }
6 N, i6 W8 `" H2 D2 q; D2 N" z */
( _3 q0 H3 p+ h! E! z //comment out all methods, N=100000 202s . x* g& ^: b# N, o$ q
}
' {6 G# u, w7 u |) B
- v1 T+ o, C% x: @ delete []b1;- r" J d1 |" {+ ^ j2 H' s6 v# g
delete []b2;
" }7 R7 r4 r: W4 c |
|