TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 P; Z1 Z& k h; p0 e
( N- {+ \( ]3 F h# J0 r3 u# f理了理思路,重新做了一个测试。/ |& Y0 |* d% G/ _+ ~2 j% b5 Q+ }
做了两个 vector 和 两个 float *, 都长 100000
% j% s/ {. c6 o7 i0 S# ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ _6 F0 a- Q& T) R
9 y) G/ u# H" W7 j+ N# @/ t
内循环试了4种方法,
! u7 v. I) }3 w2 W1. 直接调用 vector inner_product 247s
5 W+ Q0 m- W' q6 i9 Z2. vector 循环点乘累加 237s; }. d6 F6 A, N0 Z6 |* c
3. float * 循环点乘累加 204s0 P5 c0 a% X& B7 T6 v9 s0 B8 C, o h
4. 空循环 100000 次 202s
) k$ K0 O* V3 E
- R5 b, E& R2 ?不做内循环 200s. x" c( C" b+ C( m# w5 ?
9 G! J5 ]# F/ b- t) U: K, r: q& D
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- c8 x7 C& X9 u) Q2 T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: O; Z! W5 J1 N) u2 a
. p/ E$ P; n( V' b+ x
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
" B2 |- o( r/ q6 R7 @
4 i) W" Z& W8 f' `3 U) e(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); Q- o1 L4 I1 U8 v/ c4 k0 x; {9 G% E& K
' a9 z1 y, R$ ]. }1 s" N7 |
std::vector < float > vec1(N);9 M5 i5 C( `( s8 d
std::vector < float > vec2(N);
4 `1 R1 S1 \- [' x float* b1 = new float[N];
- U+ q$ r$ G& d ?' o float* b2 = new float[N];
/ G0 ^4 E1 h& I7 Z# Z
. \! W b5 b: c' ~" E! o for (int j = 0; j < 6000; j++)
?( d4 Q* c4 \2 {$ b8 j {
) O* l3 z) H7 o7 ~; C/ C# E std::generate(vec1.begin(), vec1.end(), []() {$ [1 _: q$ d! @) D: D+ ]
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, a% Y# Q" D( p( a });3 [. U% g1 p( \6 p% K& b
; L% w9 W8 |* ?7 G7 s' \ std::generate(vec2.begin(), vec2.end(), []() {* v5 F& R& ~$ ^
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 W% E L! c! z0 U$ ]! G });
! F4 y& }3 C1 x0 h2 |3 G+ {( Z C0 s+ m4 u* L
for (size_t jj = 0; jj < vec1.size(); jj++). f5 ~$ ]) U( r$ C$ I0 N
{, q/ b! @4 ^8 } e5 ?
b1[jj] = vec1[jj];
8 H* ?8 @1 c2 D+ H, T) h }5 J# `: i7 j2 H2 P
3 {1 o; e I; f; r7 v" c5 ]! b
for (size_t jj = 0; jj < vec2.size(); jj++)
) P) ^/ ^- n- ~ {
7 Q! U2 w0 @+ H0 \: p# v+ V b2[jj] = vec2[jj];
2 V% L9 U5 e; ] u3 ? } W: p$ O0 e9 \
0 w$ \0 k, B# ?! w. w) U; ]" r
//Method - 1 N=100000 247s
T- o' B" t5 N( E+ ~ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
4 k8 T) p4 U3 z
6 M+ T, ?5 M5 R5 r$ L3 D, i0 Q //Method - 2 N=100000 237s& s2 V6 i# U: p1 n! [$ Y* D w
/*" m3 V" R% d! M9 S; u# w4 B4 Z7 g: d
for (int jj = 0; jj < N ; jj++); h/ y2 c) d3 X3 b) {3 f3 d* _
{
; F5 c, H! G/ l% K fresult += vec1[jj] * vec2[jj];
( ?* [( ^# t/ v0 m9 }$ |0 J }: Q+ G e+ ` `# C/ O: O) O
*/+ }9 h' Z9 h- C5 a( `' Q
6 z- n* E1 x2 t5 i0 I9 `% F //Method - 3 N=100000 204s
, O" S$ {0 D6 p r, j) c# y6 W /*
/ O( ]3 h7 Z Q* H/ E1 H for (int jj = 0; jj < N; jj++)
$ J8 w! z; I( H0 U# w) U {8 i/ N% D; \/ [$ {# N6 g* q
fresult += b1[jj] * b2[jj];
. e' o7 Q+ u0 @" Y# V }% C0 f3 R [# M$ |& `: k
*/
3 c- k5 ]# t/ `* N3 s' D# p* f4 L
6 K! n% J% k/ s1 z //Method - 4 202s
/ ]. Q* R$ `0 s1 L /*
3 e7 q; h# D; i9 A for (int jj = 0; jj < N; jj++)
^. Q0 i- t* n- w; o. p: G+ W {
1 k8 c Y7 L) y2 q
# }9 M- M, s1 R( c' q' c; m }
0 X& A0 I3 S3 e8 K/ ]: v: l6 R! \ *// ?# j, l! [! r
//comment out all methods, N=100000 202s
" \6 W& x- [( t' f% G }
) R- q1 W5 b* W8 A; C: H: d) U7 O, t; j
delete []b1;3 K# j, P2 b& n8 u1 v2 D- @- ?
delete []b2; * ~. y, H; Z+ j1 Q1 a, P/ G. M* V1 n
|
|