TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 H! o% M+ U7 w) s( b
5 w: c$ d y" U' q P- t# L
理了理思路,重新做了一个测试。
* Z5 {0 V4 X+ m4 L% h做了两个 vector 和 两个 float *, 都长 100000. {- \) l, C7 a
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) W* }! g( W0 p6 C9 H2 j7 m E: h8 v6 q$ g0 Z3 T+ F
内循环试了4种方法,
8 u A& o% n7 p9 _1. 直接调用 vector inner_product 247s ( r r+ a- [9 J
2. vector 循环点乘累加 237s# c f# o8 E$ {" i
3. float * 循环点乘累加 204s% w2 z& I$ i- Y* h( I, o0 c; l
4. 空循环 100000 次 202s- c* ~ \. V0 }) s9 Q4 }
5 w9 G1 w$ [" Q5 ~* X
不做内循环 200s4 l g) S! {9 d9 T& o. g
2 }5 Z- C+ Y6 d) K( f/ U t7 E你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ Y$ L* A3 @- O5 I) a# y o
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
: q6 C, ]1 q8 o0 X( @+ A! r3 ~9 v `* ^* v8 \: O2 m
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* t5 f+ ]1 p) {' p2 Y- E3 d) _
) U( Z8 A, U& M/ y, I, n
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 Z* t% ^! V7 j, F' b' @- X" m( J
1 L: t1 X/ l0 S6 v1 B
std::vector < float > vec1(N);7 Y0 S- o/ V5 t! |' S$ X5 g
std::vector < float > vec2(N);* z1 p9 J& F! ?& g9 p" Y0 z
float* b1 = new float[N];
# I) K3 s/ e( W9 [/ Q1 ` float* b2 = new float[N];( Z7 O3 ^8 U9 O4 a1 v( `: P% z
9 g- A) U( z! \, @+ K
for (int j = 0; j < 6000; j++), a1 ?! N' c. n& T/ e
{
: d5 A w6 n/ g' ~# f5 f std::generate(vec1.begin(), vec1.end(), []() {6 L5 ~$ n% E" Z% n, g
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" e$ l' Y4 P* N$ L3 c3 M
});& R: F% m8 j- d* ? ~( s6 ?+ |
" m" g4 e: A' D l std::generate(vec2.begin(), vec2.end(), []() {
! ]+ ?0 B! B& k: Z, I7 @ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
1 ~# x( M1 F/ j/ k3 l [ });6 y' x0 ]9 C W. k4 r$ v
$ [7 }' \+ n: e0 g. y. } for (size_t jj = 0; jj < vec1.size(); jj++)9 W& y3 ^4 L# G
{
# Y3 H- y+ |* T* X( \% I' S* | b1[jj] = vec1[jj];
' y* J: w3 }0 a1 i" f# ~% \, C }: d! C! R( q+ I# F) M( Y( o1 i
$ j) Y( T, A( x8 g+ H for (size_t jj = 0; jj < vec2.size(); jj++), h. \" ?8 v) W
{" H/ B# a+ J( T! e. D4 ]* d
b2[jj] = vec2[jj];
( `( w8 x0 h0 Z O: I }
9 E3 O* Q. H2 d- P# A L) z) Y6 |
$ O( ]' v5 r) }/ \! Y- K! q //Method - 1 N=100000 247s # ]# u# O% R6 ]: I1 J9 o
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! m# T9 {. b" t& m B1 M
. r: `; t: X& M! _. H$ p //Method - 2 N=100000 237s
/ x3 o0 P7 b9 ^ q# D, S/ `; j /*6 j b% o8 w- u' v/ R
for (int jj = 0; jj < N ; jj++)
" r# T6 u# F3 o0 p- t {
- u7 P. T' K5 |& l8 \ fresult += vec1[jj] * vec2[jj];
& ?/ t+ R% S: e" c6 ?6 B }
0 q V) l0 u. V# J* ]& r! u */$ Y6 C' ?6 {( L6 D
" ]6 W4 @- _( ]% B0 D //Method - 3 N=100000 204s
9 B3 s; }2 N# A /*( |$ e+ R7 h3 m) g% y
for (int jj = 0; jj < N; jj++)
, p5 |% }3 _/ h3 E* r# ^ {# g; A+ p# p( u. C" Z" f
fresult += b1[jj] * b2[jj];) q6 I0 ?" e% D/ D: B0 s# C4 I
}
. r, j0 o3 Y/ S3 B: `' H */$ q3 u/ p* B5 q7 C0 w
* S$ x) j. U# ~9 v- b //Method - 4 202s
4 r" [7 p3 @! L0 }7 | /*3 z5 F! n. s& b! A7 j5 }0 M
for (int jj = 0; jj < N; jj++)
! e+ |' }: K Z {7 ~" R! M. v$ g% K2 U! i5 {
2 O8 S* V5 v) K1 ~% N( [: s( c
}1 S. y$ Q, R- R% ^/ S5 H
*/
! i9 b/ F% Y" g4 u2 \) d& g //comment out all methods, N=100000 202s $ d) U8 ^/ O* K0 m9 f- P2 h% Q
}. f! v( z& p2 ]
* P! S/ ~) x/ q- V delete []b1;" A* i& l9 U. q% X5 i; d, X4 W
delete []b2; 9 X7 s. D+ @/ ^
|
|