TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* o- z0 K5 K% Y; R* F7 S: P; E; S% |& [ s. p" w5 Q' p/ H+ x
理了理思路,重新做了一个测试。* R5 x, h2 _8 s6 H8 s4 b0 d
做了两个 vector 和 两个 float *, 都长 1000006 A* |. z# X; B) V- f/ s. f: J6 ]
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! S# ^1 r! B2 n0 g) e4 \: B8 v9 h9 h9 k
内循环试了4种方法,
6 C$ S, B* O [1. 直接调用 vector inner_product 247s
; o# K2 N1 }9 w- n' @2. vector 循环点乘累加 237s. o) W F& U' ]5 F+ t( }
3. float * 循环点乘累加 204s
" G0 \* a% j; C, x+ ^8 S6 w7 o4. 空循环 100000 次 202s
4 j, X+ B( a0 ]& D/ Z. c3 I3 {% u$ U6 w
不做内循环 200s
+ E. m# d( L9 t& ~$ J
+ r" P$ P6 [6 B E4 ~. ?& t* Z+ ^你昨天说的对,内循环本身占比是很小的,大头在其他处理。
& e: X/ C1 o5 Y: Q1 {& R9 c6 |& v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 n4 e* W) o0 ]. W7 ~! a: k
X: [, \8 D* F3 @& k! E2 t$ |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). A K+ c5 L3 B" m; `
) b) {" H% C$ q p
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 B: ]4 j5 a. H+ x7 A' O
7 |2 z2 t" v$ f+ R, l1 c
std::vector < float > vec1(N);9 l2 q/ x9 S- y. d+ x
std::vector < float > vec2(N);
5 x, T+ v+ h# ~. ~, Q/ ^% C' G float* b1 = new float[N];
& A# {5 G# t/ G/ s5 g& G8 x float* b2 = new float[N];- ^: M4 q6 _# @3 J; y( [
9 K( _$ s6 X! i1 q for (int j = 0; j < 6000; j++). M" }0 l" S' }/ {% J$ p9 V/ a) r$ {3 b
{
^$ H* c. }9 [8 P' i9 b std::generate(vec1.begin(), vec1.end(), []() {- l* M5 h* ^7 s- c& e s
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
& w# S$ a' s; v# w6 B- k$ G });
- K# [. F5 Y. r* z8 o
3 s1 x! Y0 X# t( K2 h. V std::generate(vec2.begin(), vec2.end(), []() {! `. P$ `5 a2 r o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 e% |8 H" E% s W7 I });% L" j& K/ E. Q& \) R: v5 ~4 Z- z
- h1 @! r5 ]# r: I% J+ r( o for (size_t jj = 0; jj < vec1.size(); jj++)8 }: Y2 C- l9 I, C
{
1 C* F8 a/ y: E0 T# V& h. `) x6 [ b1[jj] = vec1[jj];2 K. `. M" i- c% W4 \; A5 ^; c- H
}" X) Z; K+ k8 k3 n% A3 Z. g4 k
) M) G' Z Q. C/ m! _" k for (size_t jj = 0; jj < vec2.size(); jj++)
# L$ o' V5 C. X A {" ~! H! A' W# b9 I& k$ F
b2[jj] = vec2[jj];$ F. W7 ]+ f9 A. B) Q e
}$ S# j( j }/ ~: P# }
3 }+ p, o" k9 Y$ H0 K
//Method - 1 N=100000 247s / v& `# C$ o, c( h! R. m2 L
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& R: [; r3 |( U- k Q; {9 u
" x& v( n! P& _6 I6 ? //Method - 2 N=100000 237s
2 A) E4 o K$ M2 a3 w /*2 o2 ]1 |( b7 G# Y
for (int jj = 0; jj < N ; jj++), O8 i$ R% j3 X! z H
{
1 D& w3 b3 V N7 }; j1 a. ] fresult += vec1[jj] * vec2[jj];* U) F9 a! K( ?# s. _7 Z. _
}1 V& o: [3 l1 l% Z+ Y# I+ M# k9 k
*/9 `7 Y p9 ]6 q& K7 D+ _ ~2 x
w& X8 }" T+ \. W //Method - 3 N=100000 204s
6 v5 o" G8 i! }3 m, t* o9 Z /*
& j( L9 N! {& U+ ]& }) q) r for (int jj = 0; jj < N; jj++)
5 Z7 T% u/ u* t2 `2 z0 ?( H$ y {
& }# e: D2 ~. o6 \4 T9 z fresult += b1[jj] * b2[jj];
5 ?* U& ~* N, E3 D0 U5 e }
8 n" {2 h! h' x' r8 t) s6 i */
! M+ z9 A' y3 a2 j
+ z+ S; E' d/ r k } //Method - 4 202s
) X/ @& N) M3 x' d& w /*
# s9 p- a, H' `8 a( Y for (int jj = 0; jj < N; jj++)+ B9 I& w0 X0 Z+ [$ C, L/ @
{
( J4 x7 x0 Q! t+ ]5 V1 v- v * F c! F; a( o8 o' V
}
" o; Q2 L% a% u( G, z) t: j */
6 Z+ u+ j8 D2 M //comment out all methods, N=100000 202s
1 e) w, H% K4 b- U }# }6 e- G; I2 S, r h u$ T: Y
0 `5 ~) V2 l$ a/ S: @
delete []b1;6 i' Y' N5 q" E. Y( `$ r
delete []b2; 6 J5 z0 E ]. d- A# d; ?5 b4 @8 G
|
|