TA的每日心情![](source/plugin/dsu_paulsign/img/emot/ch.gif) | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 E' a# J' s8 U
4 j6 N4 `% a7 e/ u& p理了理思路,重新做了一个测试。) B6 C0 \( c1 g& _* [
做了两个 vector 和 两个 float *, 都长 100000
* O4 J) ~5 o% j4 O/ L5 u外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
( T U' ]0 v/ B& c: o/ O- b- o2 @0 k1 T+ z. v
内循环试了4种方法,2 S3 p3 l Y+ h/ M
1. 直接调用 vector inner_product 247s
3 f m* m4 k7 W# K9 n, _2. vector 循环点乘累加 237s) `5 ?2 x* z9 n+ z
3. float * 循环点乘累加 204s
# J7 F5 m8 p/ G. ~+ R4. 空循环 100000 次 202s
' f7 i( e k1 f
& J, w* B" x7 J8 O( y不做内循环 200s7 A& b7 U; j0 }' [- B. o, t
5 {7 i# T% T' Z# D你昨天说的对,内循环本身占比是很小的,大头在其他处理。- u* k9 t, w& b% f3 Z& `$ J
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; C1 U: R2 h6 s0 [2 \4 y$ t8 ?5 @( G- G1 X- e
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
S$ X# e m$ v" D: {. m, J/ g4 m
, f. z" S# a$ [' ~(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 k; N- ?" K+ l2 M
" r- n* y, a8 b8 _" X+ r std::vector < float > vec1(N);' i. ~# S$ g9 p" a- ^5 U
std::vector < float > vec2(N);$ [4 g$ e- {" U/ b4 c6 Q, a
float* b1 = new float[N];
: Z1 M: X% o# Z7 v! o/ ?5 n float* b2 = new float[N];
1 { a8 E% P+ R, Z
7 P F8 x& W* q9 ?5 L; E for (int j = 0; j < 6000; j++)# R# L w" y6 F0 s4 [) |9 x; |
{
, P/ c/ g5 \% @7 x( a& X0 V std::generate(vec1.begin(), vec1.end(), []() {7 h Z" E4 a: n$ p. e0 R+ q$ N
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 `, b ~0 @! ~2 L
});" u, h3 U7 m& f7 {( [3 r
; w7 }2 U4 C; l( U std::generate(vec2.begin(), vec2.end(), []() {
" F; n7 O: @0 t, L: q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 w( C% W; L) {5 h# F
});
! F6 g: n: j0 i& M5 f( W! h/ x4 @ h
5 T5 j; L" U/ D" }9 y! L for (size_t jj = 0; jj < vec1.size(); jj++)) E$ s& T5 s- s/ k7 E
{
; \2 C) T l- f5 \ k$ N& Y \ b1[jj] = vec1[jj];
2 r2 M$ }& z7 p2 r6 _ H }' j- p9 v# ^& m+ M3 k* j. ~8 x
& |& a x! h# k6 g3 J7 I! i for (size_t jj = 0; jj < vec2.size(); jj++)4 y6 s, t K3 E9 r1 O8 D# `
{1 z( S/ d) T( V# U; B
b2[jj] = vec2[jj];; S4 B6 d8 L8 ]7 F% T1 {
}
, M4 F$ y' M: M# n0 x# E1 g7 D5 D& f
//Method - 1 N=100000 247s
0 a/ B: O& Q4 ]2 a# M! @2 Y J }& x //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 J9 Q8 K' a2 K* C 1 x5 N4 g: ~) Q5 ~9 Z
//Method - 2 N=100000 237s. t. z, i+ B. Q, z
/** ~) W& K) `* |0 d
for (int jj = 0; jj < N ; jj++)
9 b/ F+ U' G) X& | [ {% P* N! ^) L, R% T- R* q
fresult += vec1[jj] * vec2[jj];9 G$ J+ w/ |) p! w+ {) t6 H
}8 Z& e0 } U" S( k
*/: P, S8 H, \' w0 J) @; `: \
% l4 ^; g+ `' _& J/ d //Method - 3 N=100000 204s( t! b5 V" _" d
/*" e8 Y* E) e5 J. L% [$ V
for (int jj = 0; jj < N; jj++)3 _8 H& r: l. ^
{. {% N- _- m o$ C+ A! y
fresult += b1[jj] * b2[jj];( r8 H! @$ N0 R F
} b) y; B; L8 Q8 v
*/
9 V* X" q1 T$ r& }. a
) l6 M) z; v9 V- a _1 J //Method - 4 202s+ G5 ~9 X7 r" k3 S: a9 D# N/ ?( E
/*) v3 h9 k" B" a* h9 z$ S8 D
for (int jj = 0; jj < N; jj++)& n8 L$ c' C4 v$ V; i
{
$ v( n4 L Y7 |- k) [0 R) O ! i$ ~/ o, P v! G6 n
}- A- k# w( x5 Q# }$ m) m6 @
*/ P; O! a& J3 `6 J: T9 ~
//comment out all methods, N=100000 202s
9 z7 _1 P) B. L( p) Z) T+ K }% a7 K& @6 I5 W2 @
/ S" {5 R q$ `3 e9 C1 f8 |
delete []b1;
) p- x y! f4 q' S delete []b2;
/ }# X' h) c; z7 l% I" B( ^ |
|