TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
h8 Y" ]' A0 P( F/ L" \( }
) j3 e! @4 x; k0 S9 W& g理了理思路,重新做了一个测试。3 I# D9 q) v9 H% j+ g0 {
做了两个 vector 和 两个 float *, 都长 100000
& @. Z6 t7 F) ?' K* f' S' \5 K外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
. R2 a/ |# K9 `! {# d8 a5 z ]6 t
1 `2 S/ Z5 {$ G T, |, J( `5 Q内循环试了4种方法,
% E. ~/ u& y( ^) u" W$ W/ C1. 直接调用 vector inner_product 247s ) I7 D1 V) X/ }0 B% p1 ?
2. vector 循环点乘累加 237s
" v; x! {; t: d7 |3. float * 循环点乘累加 204s* D' Y* \0 t/ r) K, Y
4. 空循环 100000 次 202s% Q2 w5 s& n- |9 Y: \
4 V/ _- T0 N; [# o' C$ s0 b# m不做内循环 200s, w5 S# }, H! Q
1 H- g, z/ c! s) f0 s8 \你昨天说的对,内循环本身占比是很小的,大头在其他处理。5 }2 C% y8 _% r8 N; C# Y3 P
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 _8 c; c. p' h' o* ^
; |; a$ q. h! x6 \, L
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)! Y5 _* ^/ z* W
' P* o( T1 P/ l# z) x4 Z6 l3 U% e5 `(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)$ a! o: C5 \- s3 d0 V( M, e
: s2 k' S5 c( H- z4 x' J std::vector < float > vec1(N);
3 ]9 k5 U' ^ k8 P std::vector < float > vec2(N);
1 @! P: y! y$ I: b3 J; g" ]+ I float* b1 = new float[N];1 J% F) V2 r0 ?
float* b2 = new float[N];
2 Y" N' {" U' N# {# k0 B0 i d% x5 @4 S. x9 D0 E2 R( _
for (int j = 0; j < 6000; j++)7 |$ i' s: C% X& o- R6 ?( Q5 a* y# L
{
% g( x* g S0 B0 K std::generate(vec1.begin(), vec1.end(), []() {
2 s! t- r1 _0 m5 T& E- {) l return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ y% i6 `5 I) s, y# \& G; [ });
5 ^+ s8 f, X) T1 e1 }1 {0 X
- }6 z* i. B3 [. h3 T+ V std::generate(vec2.begin(), vec2.end(), []() {& R i6 t# q* P5 D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 A( H! { {2 P# H) y, |
});
u9 R+ y8 p4 x+ t. z% i2 P+ L
7 H0 J3 Q# l5 C/ a5 G3 P for (size_t jj = 0; jj < vec1.size(); jj++)
D8 D+ o& ^% l" z {$ B8 K$ L% Z% ^& q0 ~2 C; V- M
b1[jj] = vec1[jj];
/ C5 B% _. V! J/ K, x% b9 j: u1 o }, W! o: @. |/ L5 [. f2 ]
# B, v4 t7 p x M+ i/ W! r4 d
for (size_t jj = 0; jj < vec2.size(); jj++)
N) L1 ~9 Q/ T$ W9 v {2 _$ }4 m$ L- a! P% |5 O3 ?
b2[jj] = vec2[jj];
6 [# S2 e" e5 ]( b }
, B5 |0 T/ s" ^- r( N1 @* d8 D- D# w/ k, A6 c: C4 H
//Method - 1 N=100000 247s
) o" v$ N( ?9 X; C# i$ R$ |2 y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ u) Q1 E% Q9 m2 `* K9 T 2 G6 v8 H0 B; G2 G
//Method - 2 N=100000 237s, O b6 z" ]! I9 E6 y
/*
7 s+ z! S5 q4 g for (int jj = 0; jj < N ; jj++)
1 j: M; p5 r3 t, L7 ?; V: W4 R {3 [/ J' A& {/ K2 n: m m0 C
fresult += vec1[jj] * vec2[jj];
! `$ q: l- h5 a' S" j6 e }. g9 g. V3 d% S9 c- Z: @5 _: m) @
*/6 O0 X2 F+ s- S# J4 Z0 A% ~9 J
3 o8 |+ k$ R$ T0 p
//Method - 3 N=100000 204s
$ b3 Q" |7 f+ [6 G- @% X' C v /*
! i5 R+ s, z; q% w8 T! w- i- e7 F for (int jj = 0; jj < N; jj++)9 A; y$ P7 s1 b Z( x5 M- U4 h
{
0 C$ E0 n/ S* s0 f& c3 ?! W fresult += b1[jj] * b2[jj];
+ _& a, {1 D" p. A( q# S; z }$ Q* g4 v6 d: G8 r$ @) s
*/
8 Z. y0 [0 x9 y% p) j% ]) I" s8 i5 i: J5 G/ y
//Method - 4 202s
% s6 g: H& Z0 G( t4 B9 w0 J. {& t /*
5 {6 K+ {# c$ \8 D3 } for (int jj = 0; jj < N; jj++)5 I) j0 j2 o9 ~
{6 D2 b# i1 i6 I* P: R2 R. G z$ M
; Z! q6 f) f" {, L9 \- w) { }
/ t) |- ?/ ^5 v3 h */
/ P+ S' E6 Z, [% T4 o" [ //comment out all methods, N=100000 202s
) ?0 U% {* d \: [8 Q }
2 N: K+ R U \% o1 x: N, M0 F( n& O) i( t
delete []b1;
% u! J6 f: j1 R4 G' O; g delete []b2;
, g+ b5 k* `8 h |
|