TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( Z) \ o/ r- F- ~
: J6 j h! H! z4 Y( s理了理思路,重新做了一个测试。5 k; x: v, o$ o- ^' A7 h
做了两个 vector 和 两个 float *, 都长 100000
2 K& {1 r) l5 N- O$ m) |; z' M, i0 d外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& T- f D4 q' o( S6 l
% r1 ~; M: d+ C内循环试了4种方法,
# l' a2 W, k+ ?1 U5 B4 n1 O( z1. 直接调用 vector inner_product 247s 4 W3 `, n" b8 q, `
2. vector 循环点乘累加 237s, x4 i! D1 x% m* j* h$ c0 ^& b
3. float * 循环点乘累加 204s
/ v* c0 a5 d! ] p* M4. 空循环 100000 次 202s
( ^1 Y& B- @- k9 H* X5 J( T) U7 z$ l
不做内循环 200s: S, C& ~* l( N. w5 _
/ ^0 X( {, u, }7 p- \( i% i
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ C9 l# o, U/ g: i) f7 o另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( |2 v0 X8 U) y% i9 r) R, |* K1 \
9 G7 ]% R2 M7 u# e% o
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 X1 S. N# W; ?* h4 I9 h: ^; B& N ]; V9 O
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 @1 G0 D( [5 L7 ]/ g
/ O5 p m2 z! h4 { std::vector < float > vec1(N);
$ G6 W0 \! N' ^$ n; |# G( W std::vector < float > vec2(N);3 ]: A, A5 p* h1 j
float* b1 = new float[N];4 h8 t3 c1 }! y/ a. `2 k
float* b2 = new float[N];" `, g$ ?/ }% z. _# z" h
' w) o& o7 l! Y: ?1 i
for (int j = 0; j < 6000; j++)! ^* I# U; g, @1 D; s! V
{0 \; N% G( a/ r" a# |! J; k) P
std::generate(vec1.begin(), vec1.end(), []() {, Q1 i: M' I9 h$ p5 b; @( [2 @
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! n" `3 }9 X% M( P1 l3 ?
});# e6 `3 N" r+ R
6 Z1 ^6 m0 p. | std::generate(vec2.begin(), vec2.end(), []() {$ O5 k$ O0 J0 x0 K
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- D+ T6 I3 Y" P- a/ B });
( h2 X4 A$ m: o' `; l2 h
# k# i! p2 _% m for (size_t jj = 0; jj < vec1.size(); jj++)
! j6 a9 z; k: L4 i, | {
" I9 t2 q% H6 O* {, M% j b1[jj] = vec1[jj];8 \/ ]8 U8 ]# a5 Q! S
}0 H" X$ b# o- { m+ \
5 q. y. o. b' r; V: t$ T2 ^( l for (size_t jj = 0; jj < vec2.size(); jj++)2 `* s8 L1 K# W& |" o
{
( S( l, _# h7 q1 c3 A# a b2[jj] = vec2[jj];! i7 t8 ]+ K/ N8 d3 K# v
}6 B% N& H+ v l; w4 s
4 k( M l, _) L/ } //Method - 1 N=100000 247s I8 k, `4 C% q
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, i$ r( E: ]- T, W/ T
9 L: J, F' k5 k) G* I
//Method - 2 N=100000 237s
; H# |" l; n2 ` /*
- J7 Q+ K0 ^1 g for (int jj = 0; jj < N ; jj++)2 U" l! k: g, T4 K A, ^( `0 d
{% K( t" [/ d# Z( k7 s
fresult += vec1[jj] * vec2[jj];; p: U$ Y9 p, H9 Q
}
9 f9 J8 X% }6 J */
& N" X ?/ ~8 j, z h6 ]
0 N p; W( x9 h3 f I //Method - 3 N=100000 204s, {* w% I: j Q0 j* k( L8 W# p8 _
/*& `: p0 Q$ W: X1 Q2 x8 S! U
for (int jj = 0; jj < N; jj++) G, J9 [1 E' v5 |% [% |
{
) A; |2 c1 }% M5 Z0 t5 {9 L0 D1 _ fresult += b1[jj] * b2[jj];# j9 J2 {! G" w; U4 l J# S7 T
}( u# B1 E% G5 x7 _0 z# J) \( Q
*/: m G8 |. d) a
) o; }) F i3 u
//Method - 4 202s
1 z- @3 F+ f: p* |# ~ /*
9 f6 t- R7 H5 s7 [' y for (int jj = 0; jj < N; jj++)3 s. s* Y% F+ Z( j0 k% a9 ]
{
. S; Z5 V2 O6 @4 @4 m' j ! T: i+ o2 p5 u* p8 p3 N# d; x. ~
}
I& S# J5 q9 o */
! n2 a1 x. T2 D' [. ^ //comment out all methods, N=100000 202s ' f; x$ H3 a/ `, \3 C" z6 T- \6 D
}
1 H) U8 p \ h1 t! R% ]; P! U( u1 B: z( L
delete []b1;
8 a! f( f* k9 O delete []b2; 8 F# q6 |2 k) c* y% @
|
|