TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 % U. E9 a7 T# @1 ~& A
" s- O: ]" x7 c4 p" E" E5 g5 Y9 G4 T- G
理了理思路,重新做了一个测试。, y+ O. M. a6 r7 n2 B. R3 i% \' a. F) R
做了两个 vector 和 两个 float *, 都长 100000- E( X- ^3 G! C
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' ?0 }1 b3 C, X9 _3 U$ j. w' u3 r" {) b* ^3 p9 p
内循环试了4种方法," M @# H) ^5 ^
1. 直接调用 vector inner_product 247s 4 x5 }$ ]" Y0 Q% I6 c3 `6 v
2. vector 循环点乘累加 237s, L8 m; X5 `" n3 H5 c5 q6 V( V
3. float * 循环点乘累加 204s
* ]. w x: u) ]$ D2 K4. 空循环 100000 次 202s
9 Z, |( A) C7 K# A2 E* ?+ t" l( r, E1 E+ t, c: ^4 ^
不做内循环 200s. U$ c( ~2 C& P
0 x0 `& l( }9 _+ H5 o你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, T$ a& I9 [8 P! B另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" }/ w- A8 h8 Q9 q# ]
) N- g& d& @% [- N0 k$ c8 Z6 j, k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 O' X3 E; V" s2 t* C; O+ h3 [, c! v8 u" Y# n/ a2 F* N2 e$ ^& A. p
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) D4 V9 P( F' u2 \! D* Y
( ^6 i% w' G& f; L/ U9 F/ k" G) ^) I std::vector < float > vec1(N);
: ^/ K3 p5 D, Q6 a0 P) {7 m std::vector < float > vec2(N);9 o" g1 w0 T! C7 Q: _9 Z
float* b1 = new float[N];4 x }% V! Q/ T1 c" t
float* b2 = new float[N];
( c4 q# K5 _) T5 x3 |5 d% l1 d4 N8 ~1 g
for (int j = 0; j < 6000; j++)# G- _$ Z) u$ x! r* u2 g0 g# e9 a
{8 n. C4 Q- \* g r* |
std::generate(vec1.begin(), vec1.end(), []() {
4 x+ ~4 `! _* a$ T4 _4 E return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 H5 S6 L4 V0 H });7 X: a7 O5 D+ U) B7 ^
0 F4 ]' i$ p8 h7 Z$ M# @+ k std::generate(vec2.begin(), vec2.end(), []() {
1 m9 V0 I0 a1 j9 ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' a, L/ Z% W j4 o });0 w1 _, F! d& ]7 j6 Q+ O
) V7 b9 {7 d3 j$ e for (size_t jj = 0; jj < vec1.size(); jj++)( v& L' D5 Z) Z6 w9 x1 b' W
{; B8 h3 g0 v; x+ Y+ E, a9 M
b1[jj] = vec1[jj];+ u) a4 ^* }% d" T' q& l( b+ M
}
, m' B, }5 ^& e/ Y, m/ a2 Y: a. b9 E; y( L& q1 j
for (size_t jj = 0; jj < vec2.size(); jj++)4 ~0 m' H& a0 `$ D' }8 @
{
' m9 r+ i9 ?. r3 b b2[jj] = vec2[jj];
. R9 Y& D( B" h }
" w! _1 W# l {9 R. Y. v9 { d5 I4 a2 E
//Method - 1 N=100000 247s - n: A% |& H$ }9 \, R# s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- X2 Q5 T3 g0 _7 u8 b; z
9 r# A$ ?$ C; G4 H8 v7 y //Method - 2 N=100000 237s% H: H' e( C9 h8 M
/*8 v- w+ w& t3 z8 C
for (int jj = 0; jj < N ; jj++)- P+ F! z! x$ ^4 N$ c
{+ M) f/ ~) { ^+ L0 c# @7 C
fresult += vec1[jj] * vec2[jj];
! D8 `4 z2 A/ K! e" ^ }
2 E2 ?9 @5 r+ G- Q* i, ~ */
^. M M1 \" }& `7 g
$ V, K, q- T8 I* H, A //Method - 3 N=100000 204s3 }) I& v" g% V' z1 E, i% |: H
/*" t7 Y& f" P4 y% l
for (int jj = 0; jj < N; jj++)
; K0 z' e& H! H, K {8 `. o# |/ e* Z+ i5 h6 ]) o3 k- |
fresult += b1[jj] * b2[jj];
# B! p( |, ^* i! Z) ]% ~ }6 T* G- I8 O8 H: o4 p, E% t
*/; x1 e; B. n, a! g3 R. _ H
- a& b5 Q& x) a# b //Method - 4 202s
8 d* h2 T# }. Q2 Q /*
3 ^' \# Z. N8 \8 z U for (int jj = 0; jj < N; jj++)
8 D/ N3 O4 N1 q# l k4 R9 N4 n p {( Z6 `3 e7 S# ?; P
. b+ b; i# I; j( g9 {
}
7 w2 o1 F. H# r; E& U S- L4 Z */( N# r9 {0 b8 G( ^) Z
//comment out all methods, N=100000 202s
5 J; \) V% u' r }
: z J$ x5 {* j0 d& _- w7 n, z# u3 f0 Y2 B
delete []b1;
: @! Y z. ?5 x- W& F) @9 h delete []b2;
6 p0 s0 J) H; q |
|