TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
5 T- d. C! l i* a, K% n% Z5 p' m8 L( X2 T' F
理了理思路,重新做了一个测试。
/ L, p# A* z# t6 r7 o- Y* w做了两个 vector 和 两个 float *, 都长 100000
. m$ |) l' i* w1 I! B/ U外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
/ Z+ f f& z2 `% z2 x% |8 o
4 }' r J$ ?, I! t" s& `内循环试了4种方法,
3 \1 _$ r0 ]) J6 g' y; m1. 直接调用 vector inner_product 247s $ x4 r. x: o* C
2. vector 循环点乘累加 237s2 q0 v/ F6 W/ k
3. float * 循环点乘累加 204s d" {" V& u/ ]4 n$ T8 L1 ]
4. 空循环 100000 次 202s
1 W$ X: r n7 f0 A& V
* R, ?2 G6 n# E, Y( C2 r( q不做内循环 200s
" H' m5 Z! k/ F [: G8 Y
7 g$ P5 |* l: K$ J你昨天说的对,内循环本身占比是很小的,大头在其他处理。1 D- h+ B) r+ v
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) o! {6 R4 C- p. [) l0 b6 M
6 y% M% A' i9 g- ~' D至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& {) V+ A. ~. i- n' n, K
( u$ b/ o4 ^' z) C* X$ t
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL): w8 i4 z+ e' S$ Z* C& K/ g6 I$ W
- u( g% ]+ U6 [1 q9 D9 u2 y2 {# C/ Y std::vector < float > vec1(N);
& @% R- T F. s) i9 ` std::vector < float > vec2(N);% Y3 A6 U: C5 ^, E
float* b1 = new float[N]; e5 d" H+ k8 }7 {5 B/ `; K
float* b2 = new float[N];" i; D0 U! c! g) S R* w0 i
- t; |/ D! z2 ?* i8 Z5 F; I) m: i* n; j for (int j = 0; j < 6000; j++)
. J1 B: p! |9 T/ L* K0 ]6 c7 ^ {
, i! S- U: t7 K; h& t std::generate(vec1.begin(), vec1.end(), []() {
/ \' R+ p( M4 k1 u9 t4 a return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 T3 l% m2 J% f: Z
});
0 t; ~7 Y7 a0 R6 _! Q
5 S+ @, [1 w& U6 W6 h2 o9 b" N% @ std::generate(vec2.begin(), vec2.end(), []() {& ~0 [% S/ k, q3 S9 o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 i8 l/ b$ B! r! Z+ z
});3 w6 e6 T: O8 @
/ Q Y$ n! X/ q8 J7 ^& r for (size_t jj = 0; jj < vec1.size(); jj++)( f- u# a4 U! ~) x/ r n
{
( J* R9 e I) l# ^4 h# ~' Y0 L b1[jj] = vec1[jj];
6 G' C2 D7 ?8 G$ c5 G2 p, j; d }: `* S1 Q% M8 q: g5 N4 X
1 c( T$ a& c, ~
for (size_t jj = 0; jj < vec2.size(); jj++)* g4 a- k/ _5 H
{- F/ m' N6 x; }! c: ]
b2[jj] = vec2[jj];
. v& f T; v: w) {/ y' t }+ b: n& _& E1 y
% Z+ c1 B" ?, R" A ]" K) a
//Method - 1 N=100000 247s " ]& n. \* `1 |
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
' O6 {0 f% M) e k2 u9 w+ x0 T
; ?' q8 y7 ]2 `8 N6 r h$ E //Method - 2 N=100000 237s
" z9 C4 ], S8 w8 T. j; g8 w- D* n /*
; B3 E3 } @7 Y4 C% G; i for (int jj = 0; jj < N ; jj++)
/ B: j+ p2 p5 K% d; f; } {5 k$ h7 m+ [$ w$ N& |+ e/ `( r5 ]: X
fresult += vec1[jj] * vec2[jj];
. f0 s7 q1 s7 L' Z4 e }
$ C9 B8 B0 b+ |6 } q */9 E4 d: r1 t; I8 r( G4 ^. [! R
2 t+ g" |6 D/ Q
//Method - 3 N=100000 204s
K _8 S6 u4 A /*$ {6 Z0 D; o) `- W* m6 Y7 K
for (int jj = 0; jj < N; jj++)5 ~3 q7 Y/ @0 f$ o' y
{* W2 k: ^- l, L$ k
fresult += b1[jj] * b2[jj];& Z N9 v9 v/ `2 n* R C# q* k
}. ^/ W$ q* Q# u. e2 }
*/
2 _! b4 u& S% d* p/ o
/ c% B) e5 t7 M9 u, P7 v //Method - 4 202s
) [: f" ~ i E) o /*9 A2 M$ {9 j+ U% L { M4 u- P
for (int jj = 0; jj < N; jj++)
" d0 K& f5 W/ f {8 `4 P9 k) I7 @4 I
* E4 u- f) I- b% M, i8 K } P/ r1 S" W& e# X) A3 @
*/
1 u2 f. F2 O. W& }( r4 S7 p //comment out all methods, N=100000 202s : y# Z& J- B2 c5 ?" f2 d
}
% x* G, C" v! F, L0 C) G" X) P( h% ^
delete []b1;
9 D( }+ V8 q4 g4 F( i* Z delete []b2;
! I$ f3 M4 Y$ ^1 i, x+ S. B |
|