TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 0 A/ F# J: M- } Y. m- o2 n
! r- N x# b3 o0 G理了理思路,重新做了一个测试。, }" A9 O9 [" q
做了两个 vector 和 两个 float *, 都长 1000005 b+ k, {+ {- ]) y3 L
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 D$ i4 K$ F$ o0 C( x8 c3 T
0 g$ h Z0 [+ B: a& U# g内循环试了4种方法,$ u5 N$ B$ `" }8 n& W
1. 直接调用 vector inner_product 247s ) f c$ l4 c+ C% N) r
2. vector 循环点乘累加 237s
A" `9 q+ P# V O4 F8 L; F% c5 R+ h! U2 ?3. float * 循环点乘累加 204s
: c6 a1 a! U7 v0 W: d0 @3 I$ D: Q4. 空循环 100000 次 202s
+ b: v2 B$ T5 O1 w1 g
& T. f4 _. N7 `9 x1 o& @( ?不做内循环 200s
. T( ^' D1 O/ T% g! W" F
2 j! u' ?% R0 v# G你昨天说的对,内循环本身占比是很小的,大头在其他处理。
/ R+ }9 W/ E! \; f另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 T: _4 U N, J$ K% \' a! x7 G- A
1 R+ }4 z" s& A5 k \( g至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 h( K9 i" U7 \$ h% |; c
* D, b- P/ m+ g9 E% w(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 @& K8 X9 }" E, t6 j2 Q* k9 @9 i
" {( p2 m6 D( D I std::vector < float > vec1(N);+ L8 |( c' f$ t* j7 c0 f: R: c+ U
std::vector < float > vec2(N);8 E/ K X# Y( [- t% q3 d" ^! l0 \
float* b1 = new float[N];" I& b% O8 I2 I# @
float* b2 = new float[N];
' @1 ?) |: I) P1 v" c
/ f$ G/ |3 V p6 l for (int j = 0; j < 6000; j++)
, @' M7 L7 \; [ {
$ a) ^# u0 w B' j, v std::generate(vec1.begin(), vec1.end(), []() {
3 o( U! ~- ]. Q# }+ V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;# J/ |! n2 r: x3 X7 o1 q! d2 N' p
});( X# O% z/ V. Q% \- b
3 \2 S. J# ]. a0 k( ]+ X) o std::generate(vec2.begin(), vec2.end(), []() {
) K/ `0 U& m( I$ o! X return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; Q' \( N u: D# O- s8 X6 N5 |3 } n
});
- g6 Z# n) Y$ }
$ x) l+ i C/ _5 X. V$ [ for (size_t jj = 0; jj < vec1.size(); jj++)
, Z! J! n, \9 I& @ {
5 q* S6 {3 g" M2 j$ w$ ~ b1[jj] = vec1[jj];' ]" H9 s7 o6 o# z5 t3 y
}
" M! i3 N+ v/ Y7 j6 K9 l5 A
( U- t3 o9 s. K; U for (size_t jj = 0; jj < vec2.size(); jj++)% P/ R& z6 X& b! Y2 \$ E' k
{. _2 e( a$ a* @2 ?! D& A' ?
b2[jj] = vec2[jj];
6 `: M. U* F$ x }
6 x" g) C+ H/ F% r1 ]) i) f
: n$ p p2 t7 Q0 } //Method - 1 N=100000 247s ! X/ }$ }- W [1 Z# I2 J" w9 Y, l
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ E; X; ]5 b' F; J$ O; T( Q8 z4 i
) B& z; E9 h: z! B( M# ~1 u //Method - 2 N=100000 237s" }* d: I1 o, d* ~5 k1 a! H
/*4 ]/ S! A5 c2 v# K; v
for (int jj = 0; jj < N ; jj++)
& J6 J: u C. S4 K N& S {& f: v! k, S- G2 J
fresult += vec1[jj] * vec2[jj];
9 r. d( R/ I$ t7 ^! ^+ m: d }
* U5 F, b( _$ H; q0 G */
0 w4 d& y3 [6 Q( a5 a \
$ ]3 a9 ^: I7 Y6 J& y: q //Method - 3 N=100000 204s
' ~/ T# W% D: b; E4 R+ V/ v /*
3 U9 _* q8 V4 S( E3 V% v for (int jj = 0; jj < N; jj++)
. v j' b8 H2 E' _* L {# v i( m* E. V! B3 q9 b/ ^
fresult += b1[jj] * b2[jj];! Q2 ?2 {, k% `; g; f# a
}/ y) r0 D% W/ [7 T6 ]
*/+ X" E9 j7 R2 ?( [3 V0 l/ S" a1 v3 M
a2 ~; g$ P$ p9 L) C6 d+ d& E
//Method - 4 202s
0 `9 s; q' L; `2 Y /*
$ p3 v" U j$ Y for (int jj = 0; jj < N; jj++)
% Q& D, y9 O5 x8 ^9 j( s {
& r# n2 L# z: h: W$ |$ F# m
5 _4 A7 B* X# h/ ]+ M: c6 U8 a, G M }) i _6 @4 r* A) y9 \( y( _
*/
& @5 B5 \; C# _, e4 ] //comment out all methods, N=100000 202s ( v! a9 q, k7 o s8 ]
}
7 ^2 I: X2 R8 J/ c* C4 m5 B3 J/ ~. y N) z+ L
delete []b1;
+ Y+ S e9 L$ z+ l7 | delete []b2;
& V2 H+ J" L8 t) J0 Z& G |
|