TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 I1 e6 L2 @. \
3 ^$ m2 J3 @' [4 A1 `# J' k
理了理思路,重新做了一个测试。4 ^/ }+ ~% r3 O x! x5 J! m
做了两个 vector 和 两个 float *, 都长 100000
* F8 S4 g9 p8 A( y, ~0 w' I& Z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 d; A- d3 ] ~6 k: \7 l/ X& ~ r! Z# S
内循环试了4种方法,5 f4 s8 q$ ~) W- l* F
1. 直接调用 vector inner_product 247s + `% L X: l! s M
2. vector 循环点乘累加 237s
, v5 w, \2 ]+ |% I0 L3. float * 循环点乘累加 204s! `; z1 n* o; y5 n
4. 空循环 100000 次 202s! D6 F! o. X6 \7 n& ?! l" n9 j
3 Q/ z9 F/ ^6 X不做内循环 200s
( \+ N s+ q1 A+ p+ f+ \; s9 ` ]4 k
$ @% x& u& I, [# \( T3 A, p- d7 \你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! f, i6 _+ Q( A/ l4 w. d# i另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
: z A9 ^: c4 c! W9 j' Z6 t1 e2 ~# L
. }" H, r' Z& ?3 c' n1 g: M至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 T) A/ j4 c# D- a5 g2 j0 P
t. ~4 X, u# y7 |(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 u; ~3 J1 }- B2 c: t9 b
9 H3 u5 O8 r8 j) O std::vector < float > vec1(N);
/ J. b( j: r+ e. _3 o/ u e* i3 e% q$ t- u std::vector < float > vec2(N);
/ s r, u0 U! B( p! h float* b1 = new float[N];. r. l/ s3 e# c2 r# ?$ _7 y; _
float* b2 = new float[N];
' l! b$ z- X6 l7 |
: D! g8 |' h! t: V' ^0 ~ for (int j = 0; j < 6000; j++)
$ Y# a2 V0 q" _6 t1 D {5 i9 M5 j* H( k/ ~- `( _/ U7 X- e
std::generate(vec1.begin(), vec1.end(), []() {
, s. d( L4 @1 {* D6 Q' X7 [! {$ j return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;: l* n0 b5 v8 ^' @2 K9 T
});1 z8 ^# e8 s) J/ o
% e" I1 Z+ L* o( N3 f2 U- ] std::generate(vec2.begin(), vec2.end(), []() {5 ~2 z( L' A$ G2 d g% f1 i6 o1 X
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- Z3 u- r: ?0 q7 U, }' P });$ w# s7 R! T/ ^7 h4 j
" j2 {: W \! ]+ `. s4 J$ ^3 d
for (size_t jj = 0; jj < vec1.size(); jj++)( g! r$ d- z! G+ q/ |
{
# Q% m0 a- b3 o6 N: f b1[jj] = vec1[jj];3 g( B4 n. l6 o- U8 S9 n6 X: _8 Z) F
}
$ @: t# n8 q! \ Q8 e
, H0 [/ e4 B, n( C for (size_t jj = 0; jj < vec2.size(); jj++)2 K. i- E$ f, z) ?
{& t& ^: \. G& @5 k) S2 P
b2[jj] = vec2[jj];
, j; l" z8 e1 D' s% D' t; L' n }
4 j4 s( }9 \& X/ R1 e/ z" E, X+ x( l1 `( l
//Method - 1 N=100000 247s `% I( E- U4 i! I/ g
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
P* b* k0 L% Z$ ^8 ~ 7 E7 x6 u! x* V
//Method - 2 N=100000 237s
9 L) ^+ s' f' n6 K5 u. s /*& o* _0 T& P! w0 T4 U- v; a
for (int jj = 0; jj < N ; jj++)
, N, g' g* J9 _1 O( w% ~; V4 G {
3 ?, I, l5 ]7 [4 d3 I: ?4 _ o fresult += vec1[jj] * vec2[jj];. Z* x1 q" ~2 J l" i: `* u
}
$ Y% Q, o2 _2 V. ^ */; C& p- u) e# M! h
$ l! ~+ a1 n [( O) {: v" R) |
//Method - 3 N=100000 204s8 E3 @& V$ R9 c- t7 s6 K
/*
8 Q9 K' d' ?4 g' Z for (int jj = 0; jj < N; jj++)
- U: K$ x8 ?! I6 k5 l. ], Y; Q {
, x+ V H4 D7 @( u) ]& k fresult += b1[jj] * b2[jj];
: N$ [( b* F4 A& ~$ ^6 k' M% e }
" O0 T9 n1 A' L p, A8 d */7 Z0 }/ w) C+ ?. V# G2 O4 T
8 o8 q* X: a' A8 Q! X: a/ o //Method - 4 202s) O I J6 Z& F/ m- S" q0 \4 e
/*
: y$ j$ d" ]! s8 \4 b& m for (int jj = 0; jj < N; jj++)0 s$ ?* X6 d. N: s' v
{/ @$ Z8 R/ w# h: D# } Y
$ p! H% n) n, M' U# q" M% @1 Y. i J+ L }/ J, m1 ^6 l" M# B! j$ H
*/
8 {& M/ ^6 B& E, N1 u2 } //comment out all methods, N=100000 202s & r& `4 [' ]( T& f
}
0 ^9 f3 a6 N; {, ]+ x/ `8 z. t: j) B6 ?& x( }3 p
delete []b1;
Q. @+ o% m6 E- {! x delete []b2; n; Y5 a# V0 w4 v
|
|