TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
- [- \ j( S; h0 F+ ] {( y7 n1 N' l1 o
理了理思路,重新做了一个测试。& e, Y' ?6 Y/ a: y8 T( q! R/ o
做了两个 vector 和 两个 float *, 都长 1000001 s; r% z9 R) l0 f& p
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' ?1 X9 x; b8 n0 N- }" a
' L# t1 p" H1 `4 k! w; G内循环试了4种方法,! y% O. r- G- \7 s$ Y: m
1. 直接调用 vector inner_product 247s
: E; T, y3 U. O: O2. vector 循环点乘累加 237s
: c9 G/ ?: [) Q: |3. float * 循环点乘累加 204s
* P P) ?. E) [' \$ j5 J4. 空循环 100000 次 202s8 P2 C* z% X+ ?' H% W. ^
3 N" y9 E2 N# ?' J; s2 w- n
不做内循环 200s% L# j, Y; s! w; S9 Y
- A5 t% _( |7 t4 r, H你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 L. k4 ~/ |! a7 c$ ?; A% m4 C
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. q( e1 Q! A4 B5 G6 k
9 B5 r9 o% @* X4 p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( b+ x& T0 O/ j- }5 O3 Y8 @* [7 }7 L) y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 V/ D7 Y, x0 d1 r; h, p# w8 d+ j, x, B& k) r
std::vector < float > vec1(N);! b- @4 X3 l" r+ ?
std::vector < float > vec2(N);
1 f3 X1 j+ }9 v% V. q7 K float* b1 = new float[N];2 Q J* f% C. n3 D# Q; H7 ~3 _
float* b2 = new float[N];. o( @! a- L7 Q0 O
9 p/ c& E2 s9 ]
for (int j = 0; j < 6000; j++)5 q% E. @. N+ u
{2 w4 Y5 w* {+ ~: |* L- t6 P
std::generate(vec1.begin(), vec1.end(), []() {
g) }. l% l2 e- A5 O# h return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; J1 y8 N6 t5 A
});
8 @6 S; s! [- K: [, T7 t+ t% S' D+ I# q
std::generate(vec2.begin(), vec2.end(), []() {2 f0 [, [4 o1 v) i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* i c5 a: f4 D: } p$ i9 K
});* b7 x' o* X3 T: N& v
% ]7 {7 E0 M/ L t5 q" l
for (size_t jj = 0; jj < vec1.size(); jj++)
' E6 B9 Q F6 C9 s( d' X7 E {
& u" h C+ Y X& X# w5 f* N b1[jj] = vec1[jj];, |; ]/ [# D" Y- N K' A
}
/ Q, Z' B E, Y' ]$ U& h+ f9 Y; g- w
8 e _0 ~8 ]1 T" |4 u( @2 e7 X5 O for (size_t jj = 0; jj < vec2.size(); jj++)* v! h+ ^7 d$ K- D! Y
{2 C7 S4 i* I* ]0 T# X
b2[jj] = vec2[jj];
: C! n! k" [7 O L2 h }
2 B; o! H2 k& ~ O. j6 X1 O
, I9 \4 N1 |; G; ~9 a, L' l$ H& n //Method - 1 N=100000 247s 2 L- t, z/ p6 d3 A4 x
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! J3 T2 w7 {5 O2 T3 W
2 D4 @8 t: n2 q% P( s //Method - 2 N=100000 237s
1 S6 I2 t( g2 T/ ~. ]0 D /*
1 c! D: x a6 {8 m& L/ Z4 ~ for (int jj = 0; jj < N ; jj++)- k1 @8 O1 h8 c$ o* J# t$ }
{
9 C+ }% t/ D8 J5 I/ J- u* R* @6 U5 ` fresult += vec1[jj] * vec2[jj];
' `' m5 ?) @$ f f }+ n" x3 E9 b0 N6 i9 ~3 z
*/
0 T: y. B( a) I! c , o- D4 R0 F3 a3 H
//Method - 3 N=100000 204s
) t! x' ?2 b7 |* i /*
' `; |0 \6 Y2 ~ for (int jj = 0; jj < N; jj++)
9 i" H: Y' @* y+ ~ {( D v% ?6 P; Z# w; N( P
fresult += b1[jj] * b2[jj];
: g2 [& ?9 i: o* w( { }/ ^1 ~* P% l- h8 _
*/
! A% i1 [- k" b1 z+ ]
/ B5 m3 z f9 ]6 h //Method - 4 202s* Z, u" R, C$ O9 G
/*) ?; w* d A4 d& F( q+ e
for (int jj = 0; jj < N; jj++)0 k$ s* b* s |2 n8 d8 H) I% u
{, r, }2 _; {8 M( |3 w* W- E
( t; p" M# n! s/ P# ~1 [; W7 h/ w }; O1 a$ `3 [) H" y
*/
+ p( f8 \5 p) {% l0 a, `8 a //comment out all methods, N=100000 202s
, U( t/ \3 P) A }
8 G& y* }3 g( W7 B9 X& g5 e; j) |3 A9 w
delete []b1;
* R* b. H3 k+ b8 M delete []b2; * P8 }+ s* V' z$ Y( l' P( N
|
|