TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 & E2 M( T$ a3 a" h
2 V$ N: w! e% V1 x7 u理了理思路,重新做了一个测试。
: g k. F* L" ~+ ~做了两个 vector 和 两个 float *, 都长 1000003 s. [" P2 L d
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' o+ p }+ z* L' i0 e# J5 z
) Y0 _; d" J4 A, [. I内循环试了4种方法,
# }3 s# V0 U L' y/ {0 ?7 N3 ?/ H. Q1. 直接调用 vector inner_product 247s
- |* ^! `" g @6 e; s2. vector 循环点乘累加 237s6 s4 V) \% H4 t8 ~/ ?7 D$ l
3. float * 循环点乘累加 204s2 j/ c. K U5 @9 A1 G% t3 G
4. 空循环 100000 次 202s! n% M6 t7 X3 U# |0 ~/ ?" {
, {* A6 ~& Y6 ?. x
不做内循环 200s8 N9 V. z9 C' U2 |
* C% @) f1 {, }
你昨天说的对,内循环本身占比是很小的,大头在其他处理。. [* T2 _9 r$ F, E/ Y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
5 d) v+ e! L3 j! s$ i& N( T" Y. I) U( v" a1 I; d0 a
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)2 P5 X" |) R6 p# D- s
' _( u% A/ d/ r% d7 f/ Q
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)$ ~1 `* V' v0 }# X
( L% Z- {: {. L std::vector < float > vec1(N);
0 v$ d$ R2 d" ^& P. P4 N std::vector < float > vec2(N);5 A& P' J: A( u* G% x
float* b1 = new float[N];
* b9 i6 F. L7 p% \7 V$ [ float* b2 = new float[N];7 t, d+ R% ^/ Y6 ^5 S# W9 \7 s0 L3 `
* b B6 n3 N) ]* ^! }+ V for (int j = 0; j < 6000; j++): K$ {% w7 j. A
{3 y9 u. V6 H9 Z" _
std::generate(vec1.begin(), vec1.end(), []() {$ |7 _! i9 k& A" V( M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
$ X" ?8 S& j( m' H });
$ s/ U( X4 {" [1 e# Q% r3 _- v3 O+ _3 G2 r: _" a- \7 G
std::generate(vec2.begin(), vec2.end(), []() {
/ q& T" {0 G" @- @2 U' u return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 q. Z5 ], B5 p8 g5 _ });4 U- n& ~) j$ ~ o" {9 g
' Y8 T+ A8 V9 {7 Z/ `% K% U
for (size_t jj = 0; jj < vec1.size(); jj++)
, d9 w. S* Y8 A$ d! ^ {, P% }/ K" d* Y, |* L. o+ w
b1[jj] = vec1[jj];
, `7 r0 d3 z7 O3 i }
# W' F6 r; f8 m7 B$ C3 v8 @- A4 T! u$ X) m
for (size_t jj = 0; jj < vec2.size(); jj++)
1 ~( G+ x9 T" e. x/ ] {
8 [- I5 X# s) ~8 l b2[jj] = vec2[jj];
6 W+ B/ C' ? J4 L' W, K2 J }
$ ]2 P9 n3 n$ R$ h2 R8 x
9 q* x/ B8 }+ G( a //Method - 1 N=100000 247s
9 @3 l) K% O4 E7 j4 s7 o( i$ n2 E, S //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
: x9 X6 {' X/ m7 M' h, w l0 d M r! r5 y8 F( m7 c7 B8 G
//Method - 2 N=100000 237s
; c1 M! Z! [9 Z4 n1 w /*3 h& t$ x4 g; T0 g
for (int jj = 0; jj < N ; jj++)
n5 K" b: n. X+ E* J6 D8 ^! H {' n, c( R b, J6 Q) V( `0 ^
fresult += vec1[jj] * vec2[jj];
1 ?7 ?* b7 x3 |" Q- l2 X+ W) \ }
- q: m* e4 X0 l3 z: _0 Z2 A' l4 q */# R) S5 d) E. v0 @
' f2 T7 X- H; w! [
//Method - 3 N=100000 204s
- V- p7 {& x" D /*
: X" f' s+ j: j, D c3 P' s for (int jj = 0; jj < N; jj++)
5 i$ q' u1 g+ G) `2 t' T8 W {: {- k7 ~, V+ f7 e7 }) {
fresult += b1[jj] * b2[jj];
+ b1 |5 P, }. f2 ~$ S+ g, f6 C" { }% r9 D# E) M* [
*/
5 b# X8 o p( {+ O0 R. S
: @4 t( Y- X7 @, P% \& M //Method - 4 202s
# M! h) F7 k8 S% z /*, p/ ?, F5 g! f4 N2 ]8 E- t: ?
for (int jj = 0; jj < N; jj++)! ?0 j+ m- B3 ~3 f0 K( J
{
; d! W* C7 I- F4 t% l3 y5 U
6 N9 i$ e" {( h. N | }
9 r2 `6 U1 f* b/ t! M. U+ A */
' Z4 K+ n. G* n //comment out all methods, N=100000 202s " E. H: U2 \* I& }: x
}
6 v; F. g9 }3 ^2 Y P8 x1 a& p2 P3 M9 _
delete []b1;
& s4 J; x4 ` s& n( K" w) ], w9 u delete []b2; $ k" N% Q( U& H: p, r t
|
|