TA的每日心情 | 奋斗 3 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
6 f7 e3 Z/ q2 R2 h6 F8 x! N% C+ s
理了理思路,重新做了一个测试。( p+ f# b5 w O5 p
做了两个 vector 和 两个 float *, 都长 1000002 Z; t& g' }) H) L/ M
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
# V2 ?. U" I$ r2 z- n9 E7 K- `( ^0 G) j" }# S7 m) y
内循环试了4种方法,: M: M2 m/ t$ K" }( C
1. 直接调用 vector inner_product 247s
# a: A* m/ y) ]% S5 B2. vector 循环点乘累加 237s
0 ~$ B ^. {$ L9 ~$ h h3. float * 循环点乘累加 204s6 f2 V3 i) R0 G- J& v$ M
4. 空循环 100000 次 202s! `7 `. J9 Z6 Q' v" _
+ r! z% ]; l, o) @% o不做内循环 200s% L/ o- \) u+ L, R2 q% j
' t1 @0 T4 z! t$ b+ [9 i4 d6 a你昨天说的对,内循环本身占比是很小的,大头在其他处理。
/ K) K% f9 |- m3 ]6 Q# G+ [; Y6 ]3 j: m另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( A: h" b2 w0 S, O8 l; t# c8 ^, O+ R- f5 g% N
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试); Z Q5 R- P* ~" ? s' C% f
( V. h7 q' g5 v7 K o(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); S. H9 F, W( o* v
* h( ?3 _1 m- y
std::vector < float > vec1(N);9 x' N8 k/ X# @: w8 B
std::vector < float > vec2(N);7 a5 A$ |# f9 U9 n
float* b1 = new float[N];! {1 ^7 H5 n$ q3 d. Z8 Z' x. w
float* b2 = new float[N];
9 l; P( F4 \6 G/ Q5 X4 g1 T6 b4 X3 O3 G
for (int j = 0; j < 6000; j++)
/ |% {: U3 c6 r2 ? {9 E0 T5 S: I, S# A
std::generate(vec1.begin(), vec1.end(), []() {+ G; J4 [3 v4 ~ p3 y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
& O. u! T) l9 y) i5 i });/ N0 K4 Q" O+ V4 @9 ~2 ]" I* N
6 l7 l% m K) X6 v9 M9 `; H std::generate(vec2.begin(), vec2.end(), []() {; U5 I* u: y8 h: o' v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! ]* e8 W" R" q( ~4 x) h });
2 A7 o2 O! S7 _3 e2 @- P w3 Q8 M; y5 s& `# T$ S
for (size_t jj = 0; jj < vec1.size(); jj++)
/ @8 q) S5 U% Y2 _& ]. U X {. i8 z% o( w+ L; O" B5 i( W' s
b1[jj] = vec1[jj];
7 ^ L* H/ y' k" i: B ] }
3 R% x- C3 U0 `% {% m2 Z# Z$ {
1 U- v; i$ {5 a! P! ]5 h1 u8 i for (size_t jj = 0; jj < vec2.size(); jj++)
8 s3 w$ Y& b- F# V; y' R {) c8 F* l& t/ g% _( [0 \- `, I
b2[jj] = vec2[jj];% V D4 f4 P4 g: C+ Y$ a2 K
}5 |) S7 a4 V7 f7 ^5 |/ o% A
& `( @+ I- V9 g3 |; z
//Method - 1 N=100000 247s : ~1 @9 m+ n) l
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ d8 ?- [ H; {4 m% y! R
z# b5 d" Z4 Q% h. i //Method - 2 N=100000 237s3 N. D$ h, X8 u2 F9 N
/*1 D6 C% P7 d: ?6 y, n1 x( A
for (int jj = 0; jj < N ; jj++)+ y* K, ?) V! j! [9 b- ]
{( }0 u$ x1 a9 R9 f
fresult += vec1[jj] * vec2[jj];
& \" P( {+ |7 }3 E }
( w" B5 y8 N, o) W. x5 ~+ s */" A- c2 }, q. P
: r5 N4 a8 w# C# ?/ O, r: g2 j( j //Method - 3 N=100000 204s
. ~ d9 |& r+ `9 p9 I /*+ K% }! C0 t4 H# \+ {
for (int jj = 0; jj < N; jj++)! Y2 V; g! r$ q" b
{
% U) Z& d6 G9 t' L7 S fresult += b1[jj] * b2[jj];9 Y7 F* |9 h( F$ ~
}! [9 E6 [) t9 K* i1 H: e
*/# k w* r0 j* n9 A8 m2 T8 x
: s; Z6 k: M% A/ h //Method - 4 202s
! h3 N w) c1 B) A. R7 x /*
, {+ W% F- X q# k9 N for (int jj = 0; jj < N; jj++)4 f2 Y1 o3 ]3 Z; n" @. w
{ y; Z- m, g& h) h/ W: ]
, x; P: H! z: y4 b
}
) O. w% j, C4 B */5 \5 n9 Q b+ x) h* S+ y. k( V
//comment out all methods, N=100000 202s
! z& j3 y* v/ [% }/ P' H }
+ P; i8 k" C/ J; J h1 e6 e' n* E9 `4 \
delete []b1;
( T+ P* k1 H8 X7 F delete []b2; 4 `7 K) `0 K9 ~' q, s* P
|
|