TA的每日心情![](source/plugin/dsu_paulsign/img/emot/ch.gif) | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( m6 H$ g: Y5 w, R! f2 o) S8 A
: v R; T6 u1 {) Q理了理思路,重新做了一个测试。! g' @8 e8 y; O( E
做了两个 vector 和 两个 float *, 都长 100000
# ]6 \- O8 L8 ]$ W! b3 g外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 R/ k9 ]& X e# L& v" _8 [
2 j& y Q7 e. s U) [# P0 Q
内循环试了4种方法,
+ x1 Q, R8 t" i6 ~1. 直接调用 vector inner_product 247s * ^: h T% W; {( [0 t. ^$ _$ G) P
2. vector 循环点乘累加 237s) P5 @/ m; M d1 w' x( ~
3. float * 循环点乘累加 204s
7 J, X( f6 I8 l+ q4 A* @0 s. w# R. Y4. 空循环 100000 次 202s
% Y" l3 P. z2 \% o
& I, C! D3 U' H1 e- F( Q2 V% a不做内循环 200s
/ _; ]( J& r% ?% t1 a
% L. j* f8 r( z* P9 n$ o你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 Q- T! j" [. @& ?4 j
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
! ~" b2 B N4 v* ?3 |2 F- E* @2 B$ }$ B5 O
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* W3 @5 u# c0 F6 q- X
, V+ q. R) j4 l# I(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)4 w$ W5 U8 ~% X9 g i
3 U5 U. }! X8 V/ e0 b; V4 T std::vector < float > vec1(N);
. z( [ j4 h* a% e7 ~+ i+ H std::vector < float > vec2(N);
. b. l$ T. L# ~ float* b1 = new float[N];6 [. D: N# w: f9 [- T5 S# X1 u, V
float* b2 = new float[N];7 c4 @& b& m% ?( x9 x/ F
( H2 M }% a* C4 p' _
for (int j = 0; j < 6000; j++)7 Y& Q* B3 M% }2 N- k
{) _ v( `/ }8 o1 M ^
std::generate(vec1.begin(), vec1.end(), []() {
- s' b, N7 {# j# B0 m6 _ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
Q" |+ x$ |- |/ a9 V0 b! A! D });
$ P/ L, H3 ~' o7 J' L9 U& m/ x$ [4 w; k' P$ o; q# y; [
std::generate(vec2.begin(), vec2.end(), []() {% s$ u7 R- ?" M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 s) m( r' p9 J O
});
3 ]) z) {1 Z' J5 g- Q O! s- L3 ^. H; v# ?) }- w- t6 X- P
for (size_t jj = 0; jj < vec1.size(); jj++)
: R1 c" q1 k; z$ I: Z$ f0 p {& H- p; y: B4 ^1 N5 {3 d8 O
b1[jj] = vec1[jj];
4 r/ \" m; K" E$ F }
* W4 P- P6 d( o3 O) M% G- d8 ^' `$ w3 N
for (size_t jj = 0; jj < vec2.size(); jj++)8 ]) }7 H. Q- _, L# a5 n- `
{
* t, u3 c! O( s$ c' ~ b2[jj] = vec2[jj];
; x$ u; w% n { }6 T6 C3 I1 a3 S6 p0 x6 m7 e7 `( P
7 P* Q7 F( j# {9 I8 E% }- P, _! f4 Z //Method - 1 N=100000 247s ( U% k2 k# Y( _, H1 r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
8 v+ y5 }( }+ H% c0 ]& B; i) v
8 w8 Q/ f% J: e" r( u //Method - 2 N=100000 237s
) k4 s \ U, |5 S" G$ P& N8 N0 W /*
3 ]+ f' z; a; o3 J& V for (int jj = 0; jj < N ; jj++)
& j1 ^) J2 Z6 _/ }3 R& r' m8 R {
1 b0 a: v' \# V9 h, E2 R fresult += vec1[jj] * vec2[jj];
$ o# h! [% x# T2 O: l( O4 U: n" J# } }
6 q* k, n! ^" `; Z$ z0 }, I */! y \- }2 K3 B- J* k& y
1 |5 |' C; E. J2 h7 o
//Method - 3 N=100000 204s. \5 T8 i: @& i+ t# z
/*
: U$ M6 D0 U: }' I2 M7 i for (int jj = 0; jj < N; jj++)
. L$ B# ]' y; r6 k# z" s {
: a3 C1 ]1 |% ^/ z fresult += b1[jj] * b2[jj];
' m5 q4 i% [7 ]0 G, S1 o }; J, V) a' \! z6 _8 u1 N7 M
*/
4 e! P4 Y* m& s) P( h
% X9 Y l a% z+ P+ `. Y //Method - 4 202s
& X1 H F! k; p' m& r# C /*9 N( g7 a; I" z2 T6 o% B2 T
for (int jj = 0; jj < N; jj++)
; v0 U6 f4 X- M" i! z5 W" h {4 l! F! w) _! X3 F# u
+ t# S, A# |3 J' X) n" K# p; K5 _ }
& W7 J+ \) Y2 | */ N! }0 ]" `( ?7 _- ~
//comment out all methods, N=100000 202s
5 [" u: q0 z, y% v6 K& I7 u }
4 L% O3 X7 z9 o0 l* B$ Q
0 E: ]$ W9 g5 w0 G, `# ~0 M% k! _ delete []b1;
8 I$ Z1 ~6 R2 Q delete []b2; 6 U5 x0 w1 k5 }
|
|