TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* s% r' o5 I9 }/ O8 v3 J& }% G _$ n( S. a9 A
理了理思路,重新做了一个测试。- d$ K2 A1 M1 K- H, l I
做了两个 vector 和 两个 float *, 都长 1000009 `/ V1 }* X$ Y, C+ t0 E; x' r
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 b. J6 h P* J0 \2 {, f& o4 u% g
- |+ l+ n" y% S! h7 d: K; Q内循环试了4种方法,
@+ f1 O2 V) W% {1 Z1. 直接调用 vector inner_product 247s
4 M$ q4 g+ }. ~0 D* \0 T" b2 Z: g2. vector 循环点乘累加 237s
8 {: n# C: h. i3. float * 循环点乘累加 204s+ l- M) a+ u, }& P6 \" H
4. 空循环 100000 次 202s
6 K3 P' v% ?1 Y' p( u7 h; @$ ?1 V0 B ]+ n$ C- Z
不做内循环 200s
( G' J0 r+ k, O) y5 K& X, B$ _
* a$ `* t% Y1 T你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( M E" t' R7 B7 T# \; O另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& L( W1 w( r8 ]; B! \) N5 @
$ B5 n8 i% r. }2 c( b: n至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 Y7 ~+ V! M Y/ ~6 a, s& r! X4 R4 z
# L# y. x e# H$ C
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), X- `/ C! e4 S* W9 }/ C
5 B* i# k! X% u
std::vector < float > vec1(N);
7 V$ J1 j+ a; ]1 \, j' s std::vector < float > vec2(N);3 N1 }3 j9 C p7 u$ R9 I$ j! z
float* b1 = new float[N];- S+ {9 k6 E3 ^
float* b2 = new float[N];
9 ?+ B3 c9 C5 m8 V1 Z' D1 E+ f5 i4 `" c8 C- o
for (int j = 0; j < 6000; j++)/ D3 T( t+ s# [5 x
{/ y% u$ b- {1 j
std::generate(vec1.begin(), vec1.end(), []() {* A8 [) K0 v% S8 g! `
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 ^' D5 o5 k0 D8 k3 @ });
/ Z6 H4 e( {2 z4 l3 T- X8 ^4 w4 E1 q2 J* Q" y* t) w
std::generate(vec2.begin(), vec2.end(), []() {
* W; Q( b$ b- I% M1 T! }1 s( O return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 S' z! ^# { g
});6 G/ I* C# i1 M
6 }9 H) U+ P' O/ k: m; T for (size_t jj = 0; jj < vec1.size(); jj++)
* K9 B. s: ]9 [5 A# f% x0 V' s, v, z {
/ K, X l7 U; T, c; U b1[jj] = vec1[jj];$ z d C: ?+ {7 T# I9 ?
}0 e+ s( C6 x# A
0 {" z6 l' v$ H" B2 x# o% v
for (size_t jj = 0; jj < vec2.size(); jj++)) y2 {5 z+ x/ V+ v; s
{9 l/ [2 s2 @6 G& m3 n9 k: X
b2[jj] = vec2[jj];
! Y3 g4 v* n" e7 J8 a) N! n* e( r& E }
( R2 h1 m4 H0 Q! p2 ]2 i; }
& |# |; ]8 p! \# V' Q5 `4 @: ^0 B //Method - 1 N=100000 247s & F+ q% g w+ M; w; @& L
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 R* e/ W# X6 j: M' x
& e9 y6 A2 Y1 I+ m- |1 t
//Method - 2 N=100000 237s' }; O- D, N5 q' _" g1 Y
/*
6 F, M n# t/ ?6 a5 \5 `$ ` for (int jj = 0; jj < N ; jj++)
9 |7 v+ ^2 a5 v* X! G {9 @9 U t `7 m. T
fresult += vec1[jj] * vec2[jj];5 @) D6 y+ x w
}! z, s2 X$ ^, ^% [2 q5 ?* C4 \
*/ `& ?+ |& C2 C2 K8 E# k3 w
$ G- g9 B4 B* L
//Method - 3 N=100000 204s
0 r! N$ Y8 L) d8 s! T/ C /*
7 b2 O' Q6 q: L7 C for (int jj = 0; jj < N; jj++)
, K" I, A9 H: m/ e5 b {
6 J! t3 G! f4 k3 v fresult += b1[jj] * b2[jj];- J: `9 s( g) o& x) A; @
}
6 [7 g6 v+ _+ E& ?( r */
: T$ {5 w; @$ M9 x& x
, W4 b8 P2 q) |" n p. ` //Method - 4 202s
. b1 N1 e8 y8 s0 }7 P& t$ I /*1 m, X+ R/ c; q
for (int jj = 0; jj < N; jj++)
9 j" `3 O7 _" Z; C& \ {4 H7 C7 n4 X" K6 d. P
7 v# s0 q" T1 z, ]3 h4 c }6 n& j* G/ c( w9 t8 ^
*/
I) K: R* [9 a //comment out all methods, N=100000 202s 3 {& t$ N3 b% q! O) N. s
}
3 C- C) ]3 ~4 s6 k0 f s
. ^6 F& W! _5 F9 f/ \1 ~ delete []b1;# W# Z7 W( P$ s% T4 `
delete []b2; ( d1 M1 ~) }4 \+ S
|
|