TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 " L' p0 C, f2 q/ _( a/ [# z
$ {/ g) Y9 s: ^6 d理了理思路,重新做了一个测试。/ V& N6 B5 L% `6 W( c3 i3 p
做了两个 vector 和 两个 float *, 都长 100000
0 N, K, u' V6 v( D: ?' W外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 Z' ?0 \/ s! O, h! N5 |. @
: V% ^6 [9 |6 l' C) Z$ A' [) u! h8 p9 T内循环试了4种方法,
, Q+ O) G& U- `- h2 ]1. 直接调用 vector inner_product 247s 6 g2 C' l+ @( {8 i: c. w
2. vector 循环点乘累加 237s
l* O3 `- y1 h* l- M6 o3. float * 循环点乘累加 204s$ l) V: S6 k. d) Z
4. 空循环 100000 次 202s
( G. j* y Z9 l, p0 R9 I# ?4 _( z: u4 r) m0 a* j
不做内循环 200s1 _& d. j1 C, S# p+ d6 @: o- D
! [0 N: u6 ^& n, x" ?5 I$ U你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 n; _8 B4 r7 z2 O: P8 q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; M, J( ^& e, k
# }9 b( i( ?9 y$ U至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)! P! x0 J, U+ p' A/ d) a- [
0 e* F3 V- T6 X) d) q& {" N
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ Y1 o# |$ ?2 l! z' X+ m/ c) z
3 R; n% C$ b. d) L% s
std::vector < float > vec1(N);( X! V: k# D8 d# q8 d- h
std::vector < float > vec2(N);
3 x+ [, ^6 A R, B1 z float* b1 = new float[N];
l; e7 l5 r, E P6 N float* b2 = new float[N];
6 g i& v* P7 |: X- f1 q/ L/ x. O& ]4 l# p/ n! e H- J1 h" S8 T
for (int j = 0; j < 6000; j++)
' j1 L1 `. `3 Y( O1 r {
7 T1 R* Z! t2 `6 e% @& h+ Y" [% C std::generate(vec1.begin(), vec1.end(), []() {# @3 _# Z" N0 l; y3 Y2 K' w
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
+ C8 X# Q1 Z: V$ ~8 m });
4 q+ `% U" _1 T! F* ?: h4 q
. \9 ^: y/ o1 O& f std::generate(vec2.begin(), vec2.end(), []() { _( Q% _( g, z8 n
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 K/ q) g3 V' x( v });
6 N" t z/ ~/ Q( D# \; o7 Q4 e* a$ R
- t7 n- y0 {1 E6 l" C" t N for (size_t jj = 0; jj < vec1.size(); jj++)
( Q: H$ j- P! k {
0 J6 Q) s8 d% V, ~ b1[jj] = vec1[jj];
8 Z6 D2 V9 [* i+ W }/ F f9 U/ t3 y: E4 B
& Q8 p$ R! ?9 A n
for (size_t jj = 0; jj < vec2.size(); jj++)
, Z: L$ p9 ]/ p0 U- I2 u1 p- ` {
4 d; n+ a0 [# k! p( ^) l b2[jj] = vec2[jj];
0 d9 u! \) |, z7 v R }
! S5 R* d2 L+ h) z8 U
0 q8 n. \6 H& x1 n! s$ v //Method - 1 N=100000 247s
& e$ |# |; N* m# x //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ e9 q# y: Z: B$ ]9 t$ J: f' @
& K3 K; q. q# ? r9 z
//Method - 2 N=100000 237s
6 G, N- I' }+ D" h; y9 S/ ` /*0 {& {* X$ a* O* r
for (int jj = 0; jj < N ; jj++); L9 S' a: a7 T0 r1 b
{
: X9 P* X- b" G1 k, s fresult += vec1[jj] * vec2[jj];
5 Y% {1 p8 d8 j' Z7 F }
* a: H/ J ~- x$ a& i2 f) @ */8 j& U/ {; T; c/ D; N7 a7 M9 M
% P( P% U5 L% F& h2 O9 z) Y
//Method - 3 N=100000 204s
- W) s2 A, D( o5 m% C# E5 a1 V /*: U2 k; X- @6 O1 N0 @. ?
for (int jj = 0; jj < N; jj++)
' L: v5 k* u1 A7 @( p3 n% u1 Q {
1 V" p& x8 c J* t7 P) ^# T fresult += b1[jj] * b2[jj];
9 e) y& d: R, s- l! F9 u5 b; U4 d& P }
3 \4 B2 E2 T: G- ?) X */
8 v b% d( \" r' [/ T( G% }# E; ]& k0 h0 w% T
//Method - 4 202s# R- A9 N4 Q; {
/*& s; |3 J7 W8 H0 J+ w% x
for (int jj = 0; jj < N; jj++)3 k1 g# o6 h5 P) [6 N
{
& H9 P; @# J8 U; L : a* P" }8 f+ p( G8 }* G% N ?
}
* }0 y$ r1 e, a3 G2 A */ T5 L2 B% h9 l; u8 w+ a
//comment out all methods, N=100000 202s # V% j9 N3 I2 L& w6 H( q
}' e2 v" [0 U- X% x* }! }
4 ~ [0 J4 S# A9 l9 o. `4 P
delete []b1;% _" R$ C0 Q( k" F3 @, c1 W' X
delete []b2; , x3 M- o7 ~8 \" N: Y0 U e
|
|