TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, |: G9 Y$ \ ]7 ~) y6 j' P% I4 j4 X( c& N' X3 V& r" o* b
理了理思路,重新做了一个测试。
/ g' Y# X Z9 y F* p2 Q做了两个 vector 和 两个 float *, 都长 1000007 C% \) m2 a. p& o( q" ?
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 N/ ]9 t1 y+ p+ R. r* X+ A$ h
* E- H" Q$ ^' v) o% {' J' Z. A! h内循环试了4种方法,
% U) O. t( s7 x1. 直接调用 vector inner_product 247s
: p: l4 Z- {2 p M/ T. H ], F2. vector 循环点乘累加 237s
) P# a( @5 Y: T- T$ Q4 P3. float * 循环点乘累加 204s
" G) _ v: d' A1 x1 g, r$ n$ p4. 空循环 100000 次 202s3 B% D( ]& s- T [# b7 k# N2 M
* [, H/ b3 m# C. `& O
不做内循环 200s( ?5 F+ Y0 Q6 J* Z
8 v6 I- n3 x. ~: F& z/ Y* {
你昨天说的对,内循环本身占比是很小的,大头在其他处理。 l$ T+ \9 P) |1 Y* j
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 ]7 a3 M* z( e5 J) z
K, s# r8 j m3 a
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ [; J8 w, ^1 f J9 D9 u% Y
5 }" k1 u/ Z. N; A, ]
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
_ q, y* C9 H2 H% g3 i: n8 o* b( a6 W) D6 d9 c7 h0 h
std::vector < float > vec1(N);
5 ~' ^8 G, w8 q std::vector < float > vec2(N);( j5 L( i# f! V# h; I) p9 h
float* b1 = new float[N];
$ m6 M: o2 F# Q6 _7 T( H5 H float* b2 = new float[N];2 F2 o! r1 E) `" `
2 m6 l3 s5 V4 f, n
for (int j = 0; j < 6000; j++)
" A+ {! Y7 x$ d, b- f9 \ {" n$ c5 d, S0 }4 ^. L! J0 a! Z
std::generate(vec1.begin(), vec1.end(), []() { y( T& Z% g, d* P4 M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;& W& `& @& J. U, Y% C a* m0 q/ i" L* @
});% ~2 @/ B5 q) e- h; p: s
9 r8 d. e0 r0 l, s+ ]$ ^
std::generate(vec2.begin(), vec2.end(), []() {$ E; ?9 c* J% R+ D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 c' w6 K+ H' J$ M3 U! U: R' m5 @
});
: B8 N" R0 i! P2 } X: ?* j
1 }9 q0 s$ I( }% E for (size_t jj = 0; jj < vec1.size(); jj++)( ~6 q6 J% M/ F4 F7 n' Q x# W" x# `5 P
{
7 n9 \3 t1 Q0 M, p b1[jj] = vec1[jj];
1 D; p( _- }: f1 N# x+ ~ }
" z( T" u) F; r" J( a) Q5 U, S" G4 F; o, k
for (size_t jj = 0; jj < vec2.size(); jj++)
1 {- [3 P% a r% h# U, \0 i' r {
" V; T5 K: V& a" K b2[jj] = vec2[jj];/ b, o! b/ f$ o1 o# E& p) g
}
( ~; B# ^4 y1 e& y& f9 G( }) }; C' L8 I; F4 J2 _8 ?
//Method - 1 N=100000 247s
+ Y3 u' |3 ]+ f$ n //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 D7 [6 C+ h( L9 C+ {* N
\1 X- B3 H% g' v) m //Method - 2 N=100000 237s
+ n7 D: L& z3 d; E /*; N- P; a5 O0 R4 }( |2 m$ l
for (int jj = 0; jj < N ; jj++)5 r! v& `/ e1 ?. q1 }9 `( H
{
- N3 j# c# B, R! E" H ` fresult += vec1[jj] * vec2[jj];$ Z. P: K7 m- b2 Y. w
}4 m( C4 Y( u% q& q0 E+ q8 M! U
*/
3 O0 n' B1 x) H4 y* ?5 R- j {
) k- [, t! f+ M //Method - 3 N=100000 204s- ~' e& n4 ]8 P1 ]8 k; `6 ^+ b/ o
/*
0 `6 R" e2 j3 Z" ?6 ^* [ for (int jj = 0; jj < N; jj++)9 X v1 Z- `' D+ d
{
H& B6 x2 s1 }9 B; b fresult += b1[jj] * b2[jj];' C& Q/ v: o2 h
}
0 U' Z3 g& G7 v% `, n9 Q */, g+ Z( e* N4 m* ~4 g. G$ g' I
s* Q( s- ~$ i8 _. G
//Method - 4 202s
6 P4 p, g; d) n /*
( `4 ]5 y% _8 q7 C7 x E2 t for (int jj = 0; jj < N; jj++)9 e1 U, E* k( R$ i; X- U
{
4 C: Q8 R* G. J: ^8 G6 Z8 T& k! V1 _ 6 f6 ^9 V3 ~ {8 d
}4 f. G/ ?6 i; ~1 ~1 S. X
*/
1 {' X' f4 o3 L4 n" Q ]* I //comment out all methods, N=100000 202s
- T+ _+ c+ M | }$ o6 y& ?* U+ |1 R2 |
; I0 q ~' E0 X delete []b1;3 ]! |1 t2 x6 `1 }
delete []b2;
7 o/ r8 p3 ~3 g% B* @ |
|