TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 % m" Y1 L! i: d- V3 w0 ^+ [
& h3 {( N( h* w1 ^: p: E0 q理了理思路,重新做了一个测试。$ J1 s) G% c; Q: E/ `; o3 P
做了两个 vector 和 两个 float *, 都长 100000
7 V9 G( U1 t) _7 _外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ J8 H2 a- E& u; E4 c
6 B1 ]8 Y4 O4 S
内循环试了4种方法,& H0 z, A1 r+ p0 j6 W# S1 J
1. 直接调用 vector inner_product 247s
6 s+ a9 S, R4 G7 q" {& ?( l2. vector 循环点乘累加 237s
{2 L$ ?: l% D8 i4 B: M3. float * 循环点乘累加 204s9 e. L: s i o; H& F1 \7 ]; U
4. 空循环 100000 次 202s
5 X6 }: ?$ X4 O& F$ H/ Y R
: @: `; g! M3 O9 i s6 w不做内循环 200s
* g4 `7 Y: R3 U0 u! y. {# R# A% J) J- w- X9 k7 p
你昨天说的对,内循环本身占比是很小的,大头在其他处理。% J# o) w5 X8 q: R- t: f0 H
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 V3 K! R) o0 T& z: H2 m
- I7 m# H4 c$ f% e
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( f+ J, G4 U5 L" D
/ y) L. W" M/ T) x
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 E( `* c1 m6 p" Z( O& z5 W
6 i- B9 R$ C7 ^4 X6 A8 _ std::vector < float > vec1(N);2 s, r; t: F/ m- ~- b8 k
std::vector < float > vec2(N);8 t3 \3 f; n2 Y# t) Y# v
float* b1 = new float[N];
p/ G3 G% s( {, T6 T: D float* b2 = new float[N];
2 G9 q8 ~: Q& e( i6 u: _
# T2 |' B' V& p4 n& I for (int j = 0; j < 6000; j++)
5 ^+ I# }8 K/ g2 @+ ?" s+ ~ {
/ q8 N3 I" r' ^ { std::generate(vec1.begin(), vec1.end(), []() {
5 U5 Y& w9 i/ n: F return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, G% A8 j$ c: p; E9 B3 T2 i% p });$ K! C! H: A/ _4 v2 i
. T# M4 r$ m7 j$ y! i; g std::generate(vec2.begin(), vec2.end(), []() {6 z% T3 b8 b1 {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 e q% s) l) U7 u$ K6 Z' v });
$ t5 z5 U! q/ T P: {1 A% ]
" O! a( U1 i$ _ for (size_t jj = 0; jj < vec1.size(); jj++). F! p" U/ ~+ z: G" o5 e. S" D$ b
{; Q- s7 d* ^! g5 {% |# ^$ L+ S
b1[jj] = vec1[jj];8 s1 \: t3 P- E, d. ~. [
}" S+ @( [; F9 P+ H2 P' h! P
* u; C E8 }$ h for (size_t jj = 0; jj < vec2.size(); jj++)1 P2 ~/ `" V" z$ T- _! D( ^
{3 ?* e, J( \ E, b" q! H
b2[jj] = vec2[jj];
6 @' i4 U4 b5 X/ M1 F' [ }+ T* s3 a" K9 z: S( R& B7 `4 e
8 o3 c2 E$ `2 t* |. U- T
//Method - 1 N=100000 247s
2 S* H% e1 z& D |' A) W //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ M8 F9 N/ c( a, v& A' \, S , _" c& Q/ Z# {5 z* _; [
//Method - 2 N=100000 237s
4 g5 F! v' B; } /*7 [: |8 N( |: E2 q
for (int jj = 0; jj < N ; jj++)
- v" ?! e7 o. Q# o- a {
2 }4 ]" [7 Y3 m6 A0 d+ w/ R9 Q$ t fresult += vec1[jj] * vec2[jj];( Z7 f5 a# ?4 A2 X% ^$ w' s
}
5 g5 `5 S# Q7 z) y" ]) r */; d' x! i* }* k% T ? l6 H
% F- Z5 |1 m( K, e1 A3 W" {
//Method - 3 N=100000 204s X& v* e. h8 T4 m5 z; Q6 O
/*( V& u0 I& \5 n. {6 r
for (int jj = 0; jj < N; jj++)
% s1 z& j, R' T+ d, F% E9 w- Y {) M3 J2 t: r& \7 ^+ W
fresult += b1[jj] * b2[jj];
5 m' A' U) D+ S: _! B }
; v# B* A' ]6 B */) L4 i- H7 R' n8 ^" G+ o
$ J6 x! }3 b* Q( g3 `+ F' h1 X) E! R //Method - 4 202s& [. w5 F6 h1 n% ?, c3 x
/*& j( W1 Y0 c1 ]; ?& n
for (int jj = 0; jj < N; jj++)
& B L s4 t4 l$ c2 B: B8 a {
+ S i- O J( R2 `8 ]% G$ W; C$ O + K. ~( z @2 Q% K4 K) x# z
}
1 G2 V Y( K; \ */
: ^/ Z' W; `" Q6 ?/ F" k0 N& D: \ //comment out all methods, N=100000 202s
, T: ~9 }0 k1 N! u* W% C0 v }
( N! D& z6 U$ ?9 d( `: p# T; [! q6 Y3 h/ n& p0 ]
delete []b1;
* m6 x, v/ [) |0 s; i: z% O delete []b2;
6 c+ ^5 h# Q$ U- [) p |
|