TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* n& |+ G# o5 p* M) z6 C6 Z1 q. C( H: _; u v6 D7 o( X
理了理思路,重新做了一个测试。
9 ?0 ]! v8 h7 |3 \4 m做了两个 vector 和 两个 float *, 都长 1000000 _' a% X) L2 i5 q
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 q' H5 H2 a; r# o% t
' j' {8 q) d) Z# Q# a
内循环试了4种方法,1 e: D3 x9 p" P4 b% w6 `
1. 直接调用 vector inner_product 247s ^3 s5 ~3 v1 }# D3 o3 W- C
2. vector 循环点乘累加 237s! ^ |: ~# T5 i) j
3. float * 循环点乘累加 204s
0 y0 J5 U" {' T1 B/ g4. 空循环 100000 次 202s+ c5 E1 S# j& p8 U
# Y. T9 @- O" U, k# G' B4 F1 i不做内循环 200s4 L2 g5 V) z5 R6 R
2 r5 L* F1 v) i0 H
你昨天说的对,内循环本身占比是很小的,大头在其他处理。* D! x) R$ i, z5 g+ T, h9 \9 L
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 G" ~8 |$ i6 R2 R
7 O9 k% s7 E, y" L9 G
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; k7 x8 N- h4 u# x# V( i4 h* A
/ M l+ X* G* ?& Z) |(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)# h8 I: D0 o6 X0 {1 T
s0 n, X9 E9 s+ l
std::vector < float > vec1(N);% n' i3 W" o3 g) F8 M3 c) N, l
std::vector < float > vec2(N);
2 m2 }# z! _5 X' q/ t float* b1 = new float[N];! ]& A% ]5 Z+ u. @
float* b2 = new float[N];5 @, O% F# w3 H3 b
3 M" F6 U9 C$ H* ] for (int j = 0; j < 6000; j++), Y% a `+ _* V2 q, j
{
, @1 M$ C' c& U+ q5 i0 p/ C4 n std::generate(vec1.begin(), vec1.end(), []() {$ c1 Z! o4 w) ` t/ r
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
: Q; N& c0 ^0 w+ {* t% W });( }* `9 {3 u; u9 j
. w& H9 m$ O5 R- @, }6 W9 P6 B
std::generate(vec2.begin(), vec2.end(), []() {8 n/ |7 }! c* W7 A7 V9 l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;" ~& M+ e# y, O+ j0 _
});+ {/ i V- B6 m$ m4 ?5 S
G) H% S/ g2 } for (size_t jj = 0; jj < vec1.size(); jj++)
) J' B9 M0 ?5 h7 F0 x/ X# S) U$ \- a {
! ]5 W, ~9 k8 ?/ E- @ b1[jj] = vec1[jj];$ O% [7 `" z. X; D( W# m9 }3 X
}4 `3 y/ g% j2 P M' p
+ U+ d: B+ l* x: g$ X7 h2 y
for (size_t jj = 0; jj < vec2.size(); jj++): U/ g8 m9 x/ P6 J1 [
{7 T* a7 \# s1 r( S' b% X8 X
b2[jj] = vec2[jj];/ y* c. t0 m2 l6 u- l
}
! j# A- n. Z8 w' x* A$ S G6 d, y- g) K6 n7 l
//Method - 1 N=100000 247s / k# I' X3 R( i- f* O$ P
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( M1 {5 x2 Z9 m B 5 b; j9 e" O7 f) R: Q
//Method - 2 N=100000 237s
5 N2 v( @& U7 T! ?" @ /*8 _& l. |4 |6 p, [ V! o% | J
for (int jj = 0; jj < N ; jj++)' i: N9 S- h3 P4 P3 X3 U0 X
{
6 u: M4 I# c6 c4 w fresult += vec1[jj] * vec2[jj];5 l# p4 Y* Q5 c( J, w
}
+ E4 F y9 t( [ */, z( y: O$ A1 r1 i4 F& _
- H8 Z& j7 z4 N- Z9 l //Method - 3 N=100000 204s. m/ s0 b, ^+ d8 E: Z" o/ N
/*; X) j2 Q* N$ l7 t2 D
for (int jj = 0; jj < N; jj++). x4 d1 D, @1 F( w% o. I
{
0 K& @7 Z2 x4 `0 i! N) ~ fresult += b1[jj] * b2[jj];
; M8 f& g2 z, p1 z5 v& H" M }! c8 f# e" d( I$ ~
*/1 B% ]' n$ _8 \. ?& f6 R
( J7 F& G, O8 ^8 z7 j( d //Method - 4 202s
& U+ Z$ X5 M' L- b, m! P* y /*2 m1 r3 _7 E0 p. v
for (int jj = 0; jj < N; jj++)1 X7 X0 S3 n3 S5 y3 E
{( C: J8 I I) s: t+ D
1 B/ j8 C7 n) ?' H* b }) E5 |7 l; F1 _7 V
*/3 Y) g6 J1 e; w9 u! S
//comment out all methods, N=100000 202s
! _7 l/ r# b: {; q) W }
0 p, W+ ~. v/ ^+ h. t% A2 M, N1 B+ y; `
delete []b1;0 j+ U8 K" ?2 {- \' Y$ n
delete []b2;
$ m* h# b; r# V1 p3 c2 [ |
|