TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + G, M, _8 `6 \" l: \1 M8 [( S
6 d$ y# U$ t( F* }4 N
理了理思路,重新做了一个测试。
1 D" |2 \$ X7 }7 m3 s2 A9 b做了两个 vector 和 两个 float *, 都长 100000
$ F3 Q; `$ p. n, v+ e外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 M+ s# y2 F8 u1 S% B
' u" H* ]/ Y. d/ f3 \- ~( a内循环试了4种方法,
# y- P# q& o% T" |1. 直接调用 vector inner_product 247s
. q2 x& s" O C7 f; K2. vector 循环点乘累加 237s
9 H) G( D: N, l$ S4 }. l3. float * 循环点乘累加 204s
& s8 c% e. V# `* I9 h* G4. 空循环 100000 次 202s7 ~5 r, H$ ` u2 {2 [% q
7 ?5 Q5 k% W& C4 t. Z1 [/ o
不做内循环 200s+ H( X5 C2 g f E, ?0 w
2 C& W, ^# V9 T. E4 @9 a8 S你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' V6 P$ a( x) b! o$ J另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
% ?- d4 \$ \; @! @8 s4 \& a1 i- w4 L" z7 x4 U/ q; I
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 T; l1 O8 {) W6 T2 L
! O( S* V3 f% [5 T V2 S1 a
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)( ]) y: i: m4 Q: R7 h: u
: J' ~3 T+ b. A; X2 F4 e' B& l
std::vector < float > vec1(N);
7 q. r, v$ @7 K) I" t std::vector < float > vec2(N);6 G& w/ |: R5 L3 `- u9 W
float* b1 = new float[N];
) U6 P8 J/ l! q3 B4 ^' |. j+ p8 @' k' X float* b2 = new float[N];
: v- Z; W+ b$ _& J( m d8 o/ y7 Y! Q- m# L
for (int j = 0; j < 6000; j++)
, i+ r1 u4 ?2 @" h4 B {3 M$ ^; ?" f# D( Y$ i
std::generate(vec1.begin(), vec1.end(), []() {# J5 `" t$ L: S, b: R# u' @
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 }2 [! Y) g" M3 h) `8 d
});
- R; z2 {3 l/ k% v' K2 v. n- k$ y& x4 h2 p1 G$ i6 z
std::generate(vec2.begin(), vec2.end(), []() {7 l# i5 y0 J" E1 @" q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 U# c b0 k8 {; Q
});
* z c4 l' B) l9 x) J, b: l9 S/ A2 |4 X* e' C
for (size_t jj = 0; jj < vec1.size(); jj++)
2 u6 A0 x! q' j, q5 @% X+ f; G" i {' A [: v: l# d. U9 J) n( n
b1[jj] = vec1[jj];
: h' N3 J( j5 L/ x% l4 b }
! ^! c1 B: C, H6 l, y8 Q- B0 @
O7 A9 r( ?1 R# z- M for (size_t jj = 0; jj < vec2.size(); jj++)
1 a. t$ M" F& t {
0 ?5 h4 o0 P8 ^# Q b2[jj] = vec2[jj];
6 t4 P9 Q3 ?$ K6 u: }4 k }
: x0 W7 k' U. F6 n( q: l8 O" Y9 _% H Y/ [
//Method - 1 N=100000 247s 2 V7 G- `( L( G7 F$ O
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);% x) G( g; R5 V. j7 X8 K
1 ^9 r K. q2 D c
//Method - 2 N=100000 237s* N: p! P/ ]2 i x( w& S7 k& k+ c
/*) F0 E; g9 S1 o( x2 B# E: h/ {2 w
for (int jj = 0; jj < N ; jj++)7 r$ T& L. F6 K+ k& K/ F+ z4 V# U% S9 S
{
8 p9 a7 I, O8 i fresult += vec1[jj] * vec2[jj];
& ^) G8 Y s1 V5 y" C }
$ }/ v6 n& ~+ F */
% j1 L2 T$ a% Y# j& D$ H# j1 N e( t
: w; r( j g& f* C5 b6 P //Method - 3 N=100000 204s5 ^- E' |2 k6 i1 C& D
/*8 w/ c4 f- X* {; e
for (int jj = 0; jj < N; jj++)2 S( H- `, a. ?" K
{) p8 c7 Z" A% S. o1 V: Y
fresult += b1[jj] * b2[jj];: F+ k3 O& {( O
}
2 m( {- \2 ]8 ?2 \# j */; W8 V$ M) Q& |% P/ o9 `
" C0 j8 K, g& o. ]/ @; I, z //Method - 4 202s$ N ~) o( x% ]+ N5 ]! S0 r% [( Y
/*) G# X7 y) _4 p# v
for (int jj = 0; jj < N; jj++)
& l" z$ z8 c+ a' F. | ~ {0 Q* Q1 P9 Z/ J) ~9 m
+ w; o* ^5 ~; \
}
7 [, C& w5 a; j6 V n8 n */
4 u" j5 p/ {0 w% ] //comment out all methods, N=100000 202s , U3 G6 A2 H. [' j/ I/ r3 D9 M k' E
}* R5 V8 h; M2 D2 n1 c
! ]" R# n' J' [+ v& f delete []b1;
; R0 B/ p% C' V$ y9 O delete []b2;
3 K$ N! v7 f, ^5 ^, S2 K* R: [ |
|