TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 1 p( o: M4 i' y5 C5 n% T
" x( Z7 J/ [9 p9 W
理了理思路,重新做了一个测试。0 f+ l I' d$ X" G8 _
做了两个 vector 和 两个 float *, 都长 100000
. A) O7 y% D" q& v- r外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& f% E7 J( G7 W, J
5 S' m' h* @7 U1 C
内循环试了4种方法,' `6 v$ H) a$ c) I( v
1. 直接调用 vector inner_product 247s
3 H! F! s) g. f9 B* G4 U2. vector 循环点乘累加 237s
! o" I( f8 v% r( r! |2 b B: w' Z2 l# R3. float * 循环点乘累加 204s( b6 `2 V1 B6 F0 q7 }+ ~# o
4. 空循环 100000 次 202s
- r9 j& t& q& G" e
6 V7 s5 K# _& |+ ?% H! a; h不做内循环 200s* O+ V$ i2 {2 z/ V
1 I, D. Q$ Q7 q: p
你昨天说的对,内循环本身占比是很小的,大头在其他处理。1 Z4 a% o' S" k3 t& h
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
$ c, b7 p: Y5 k' `- Z n8 J$ ]7 ]$ P/ G$ {
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 Y) \& E7 x6 _- k. P' ^1 Z% F
5 C8 ^$ ~' R0 P# R8 n$ G' H0 P* z4 W
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
B2 T, w( F4 j
6 T4 i- x; u6 y- F; | std::vector < float > vec1(N);' ^) F9 n9 [& i; k
std::vector < float > vec2(N);
& G" P9 A# b* D3 M9 K7 ` float* b1 = new float[N];2 Q9 j! P+ X, U4 X/ L& E
float* b2 = new float[N];( M7 b) j9 {$ k8 k7 F
* B" M. t9 Y( i for (int j = 0; j < 6000; j++)- N4 ?4 S7 S$ P N* Z
{
4 X+ E% m2 A; x std::generate(vec1.begin(), vec1.end(), []() {; L$ v3 K# z/ w+ X8 w+ ?' A
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ c; G7 N. h( h
});8 l K* O. Q( v( @
2 _9 k7 T0 s$ j
std::generate(vec2.begin(), vec2.end(), []() {9 B$ R5 ]. H$ F3 g: o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;- H. Q' f+ F1 H! R
});5 R. ^1 ~2 V8 e7 R! K
) V3 o5 D% d) U0 d
for (size_t jj = 0; jj < vec1.size(); jj++)
2 |. T4 w% Z B R( K {
6 f/ W. M% x4 E5 U2 Q; { b1[jj] = vec1[jj]; @: w7 {( N: {/ ` L$ C3 i
}: I0 N+ u/ t- y( W/ E9 \ {2 O: L; d
! l7 n! O& v" V) z' H% w
for (size_t jj = 0; jj < vec2.size(); jj++)
8 \! k+ Q0 |* f3 A: E1 h {
4 {% Q |" [% Z$ ?. }8 N% | b2[jj] = vec2[jj];
# z; q: W9 _3 V6 u- U9 Y1 c }
$ |" e0 W8 i8 q1 e: J4 z; i D- y- Z( b* K/ Z
//Method - 1 N=100000 247s
. d7 t; j- `( M) O8 ~ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ A# D( R2 s. b" }% H$ O
0 ~* e' D& k; p7 T7 O //Method - 2 N=100000 237s. K8 u, _6 k: I9 }' O3 ~
/*
1 X9 B. p2 E0 Z9 y- g for (int jj = 0; jj < N ; jj++)
6 G9 X/ g. p+ ? {
_6 p: k% Z- G) w! U fresult += vec1[jj] * vec2[jj];$ U- ?' |1 Y/ ~. x
}
" ]0 T) m6 d1 m, G0 ~( r */+ R9 ]& B6 I4 N' d+ F; J {
+ _: k( L; b' {& { //Method - 3 N=100000 204s3 n H) ^. M) C. z
/*: B2 d7 v O8 C* W
for (int jj = 0; jj < N; jj++)
/ J& v8 r; m$ [1 _, n9 ^' n {9 D' k5 Z/ \/ i/ ]" Z- ?
fresult += b1[jj] * b2[jj];+ H- w) D( R8 ]. G2 O. D, o
}
7 w: K0 y# X) y' t8 Z' ?$ i */
8 v& p' Z7 ], S3 d2 u4 Y8 p1 X' B; j$ e1 s) l; a3 Z8 c
//Method - 4 202s
+ u; |) V; W6 O* H /*1 p% K4 I% ^& ?4 `7 G
for (int jj = 0; jj < N; jj++)
5 n3 L5 C3 _ p {
5 _7 i* j# }& U1 m' ` N- t+ N9 k! m
}9 J* s1 F" R: ?. z8 ~% A/ f
*/
0 m% s, e! I! X/ `. @ //comment out all methods, N=100000 202s
/ t& _8 D$ {* Z1 R, H }
6 F ^3 s& p; Z( `# J( z0 L' I, Q- U; i/ D9 Y
delete []b1;9 m Q8 R2 f: y6 y3 T
delete []b2;
) P; Q8 H$ w* {! r7 s |
|