TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
3 |7 g) E7 B, g) T) ^: ~! F/ P7 A+ {* R b9 h2 |, E* t) r
理了理思路,重新做了一个测试。- y# f, f$ @0 w! V; r6 ~# f$ ]
做了两个 vector 和 两个 float *, 都长 100000
; L1 f0 a) s$ l/ `6 p外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 v' o Q4 {" X& d. h
, J- a# M7 V9 ^7 X8 X3 i
内循环试了4种方法,
: ?( m' Q9 T2 j# v1. 直接调用 vector inner_product 247s
0 m6 a# B1 D' \: k+ u+ v) C8 V2. vector 循环点乘累加 237s# L, a n. f: y2 o: O* X
3. float * 循环点乘累加 204s+ L n# y! O" i. V+ R
4. 空循环 100000 次 202s
, J: s/ v8 v* X* w W0 {1 X# M# w/ t4 J7 I) m
不做内循环 200s
5 S( A1 Y7 ^0 b
- k+ u/ _+ n" Z/ {8 @+ ^! S$ U你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' V7 U X# @& H% a S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* K9 |$ \5 A( V: _+ x) n* R1 e& T
, Z: I, v# w& {2 A7 v" W
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
3 \- H4 G( P2 `/ E# V- H$ [& E
$ d1 r- B5 n& S0 w, [/ t5 O(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)$ i2 `% a y+ W
1 H* t1 ] ^& m
std::vector < float > vec1(N);
- s$ C9 m8 R3 H5 e7 J std::vector < float > vec2(N);
* t) W8 j2 c' R' f8 p1 d) I6 [ float* b1 = new float[N]; T" G# n: R. V
float* b2 = new float[N];& I: B7 I1 C/ g; E8 [* w) F
4 M7 v% S$ v. z for (int j = 0; j < 6000; j++)& h; H! z* B% ~. Q; P7 v
{8 c; N5 J/ t: M6 N9 j
std::generate(vec1.begin(), vec1.end(), []() {% q; B4 \9 N; I! t4 L+ Q6 I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' c9 @- S( T. F3 ?) v
});$ x6 R. R; N8 h3 ~- y: r6 b$ ?
+ E& }) v& P: P& S; f std::generate(vec2.begin(), vec2.end(), []() {
" M- F7 t8 o6 A- y, W1 o return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; @# P8 R- n' o9 I* i
});) b2 g9 L; l$ b: b, s. p
* f0 ?1 H* W- Y- s for (size_t jj = 0; jj < vec1.size(); jj++)$ W7 Z& ^6 x5 [0 Y3 e1 \
{
% ~! Y+ V( @* I b1[jj] = vec1[jj]; M: J6 M( q/ e' ]/ Q
}# a: S- l; g+ L; M7 h7 v' U
/ w. G2 g/ i% H/ p! S; N for (size_t jj = 0; jj < vec2.size(); jj++). w: y3 X6 L4 v% a+ {/ ]
{, r( E# ^# {' Y+ ?/ d& I3 `& l
b2[jj] = vec2[jj];$ D9 h1 O' f' L
}7 V6 `2 L. B5 |& w" s& y* }5 I
# Q6 z$ J% g, W( \9 ^
//Method - 1 N=100000 247s
3 X' M7 h3 S8 m" F% r5 k //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 _; ], Y& o$ @( w ' ]$ G7 m. k& ^4 v/ b. W, v
//Method - 2 N=100000 237s
1 T/ [1 T; A$ {; g /*
% k V7 n3 v; i3 E7 A2 j for (int jj = 0; jj < N ; jj++)
7 C6 |1 j0 n% p {
6 _/ C# @- S4 j( e$ Y; {$ ^0 f fresult += vec1[jj] * vec2[jj];
4 v" [5 O4 K8 ~4 S2 b }
0 I$ V3 Q$ S+ b */# l4 o( n+ Y5 d. b) M: V
2 K0 `( q7 C" r( u
//Method - 3 N=100000 204s! t, s ]* p; B# w9 j
/*& g- _/ f7 j6 a
for (int jj = 0; jj < N; jj++)
/ _* w. R% M6 C+ G4 @& j {$ P4 F7 U2 E0 t- p# ]
fresult += b1[jj] * b2[jj];
, \8 u" }; a6 O1 s' B }
& z" ?+ m: z. }/ |2 f9 _ */
& w: g# n' w1 }( `% M t8 i2 E0 x! V
1 R+ q$ v- x" d9 t: F' C$ O# Q //Method - 4 202s
% i; W8 b( q0 _, V2 C/ M /*
7 j0 `- d" D% V; R' ] for (int jj = 0; jj < N; jj++)$ s p* P$ X; {
{
( \2 A/ |7 l9 e' a2 I9 g
: x' b9 G/ t j- j u }
. Q$ t$ A) s. }2 t' e */
7 v2 Z2 s' B3 p! ] //comment out all methods, N=100000 202s
; i3 w+ G3 ^8 t7 v }5 _7 B8 }/ g# k9 h8 X
& y& F- N: E S G+ K
delete []b1;
$ T4 a. t0 a: H/ r D delete []b2; ! W1 f- r! l3 t( m/ C. m' [- f/ f
|
|