TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ @. }7 W4 J5 S: m/ r
- Y2 g" G( X7 B# D: x理了理思路,重新做了一个测试。, n6 o/ O' x) I
做了两个 vector 和 两个 float *, 都长 100000# Y5 ]: [$ s' i( q6 |& n) x1 r
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.1 b; q, d) p+ ? d% X
! G/ @" i5 f. W! Y5 {8 m
内循环试了4种方法,9 ?3 O' {& k0 t
1. 直接调用 vector inner_product 247s - P8 H8 _0 D0 l/ t7 D
2. vector 循环点乘累加 237s+ n( p! r0 Y6 I
3. float * 循环点乘累加 204s6 v2 K. @* \: W# _0 I" b* c
4. 空循环 100000 次 202s8 l% b0 o! F, g& @7 m: f5 i( e
! N( I, i1 L l5 z% s不做内循环 200s3 S8 L: e2 d! @/ ^
) X7 g8 u% K4 u
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! s# J* }+ u7 f另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。' d7 N( y7 |0 J: v
' \" d% M3 Y, n至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" D% l# _2 F4 O: u, H
2 a( J! G4 f# X0 D; L7 u* [7 v(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)* L9 c7 k3 q; h0 ]
- v2 h" A' f% l; s' W/ J7 g. ^ std::vector < float > vec1(N);2 I" j5 g2 F# T' v
std::vector < float > vec2(N);0 f: N: z" _- |, |$ s9 Q; ^
float* b1 = new float[N];
: ^# s# {& f! S+ q/ z* O float* b2 = new float[N];2 w$ U/ s/ s. R+ K' y
3 j o# @$ V# g9 r7 }5 n7 X4 | for (int j = 0; j < 6000; j++)2 l! _0 |; Z% {9 ~ A- U$ j
{, A7 B3 Z/ C" v1 C( [& P9 G
std::generate(vec1.begin(), vec1.end(), []() {$ f h8 _9 Z6 g8 [& r3 D5 ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- q7 {4 f9 S7 L& g3 q0 n) t });; T& r/ m* C! Q% K- U1 e
2 c$ J* x1 P0 I j5 _ std::generate(vec2.begin(), vec2.end(), []() {
7 ?* k- L+ [+ }( m+ |8 O1 L9 e return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; x$ Y$ m! u7 C$ m });
4 {2 |, |# }2 u8 ?) G @
0 q" l1 o8 s" u/ h- \1 y8 x for (size_t jj = 0; jj < vec1.size(); jj++)
* u+ U3 t" k7 J; u" j {0 V2 X# ]7 P# l& C
b1[jj] = vec1[jj];8 y' d4 g5 j6 s# y0 f
}0 [2 C0 ^+ r1 L$ K. W
- i, A9 N, w3 @3 G2 N _/ n+ B
for (size_t jj = 0; jj < vec2.size(); jj++)- N, y6 z X' O" r' o. {% f& z( U
{ a! C% m; P( _# N4 H. ]
b2[jj] = vec2[jj];
+ X/ [% Y1 _$ H- E0 G; y }* W g3 s4 ~$ I" m+ w7 y
/ y) h( d0 [# ~% t
//Method - 1 N=100000 247s + s: g0 W, y5 r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 D( v/ H, f. [+ r
/ N# Y9 u1 ~$ W- V! L //Method - 2 N=100000 237s/ e) H8 F& u5 q9 I
/*
8 _) A- g& ^. k R* U+ O- ~7 v2 W for (int jj = 0; jj < N ; jj++)8 y+ Z# s% x9 i+ |6 W
{/ s$ B, n2 z5 l8 u+ a
fresult += vec1[jj] * vec2[jj];
# S2 g7 @9 B/ ]$ Z# `( d! c8 U }! V) p, l# o1 S* I3 ~9 u
*/, f- H6 @+ @6 e/ H# r9 j) e+ x+ ]
% K% C, N& i' r5 u //Method - 3 N=100000 204s8 Y* ]/ m% V, R( p' ^% j8 `( R
/*
# @, f. {! f3 u. a f for (int jj = 0; jj < N; jj++)
1 ^ i% Q% b% [0 q {7 x" G- a# O0 Y$ l5 w& A
fresult += b1[jj] * b2[jj];# F: i, k& _/ R% a6 G9 u
}
( S0 z: f, ]$ k M# U */3 {: q/ s# ]1 }7 T! K
6 @6 E4 c* n, [3 x. u //Method - 4 202s6 u6 O. e% m) F8 P4 ?# C
/*
3 N+ Z y" @- O& X" i: r for (int jj = 0; jj < N; jj++)# e, l1 `: _0 u( I: R
{
- H$ @7 F5 u: s4 T: C0 J9 ] " x/ L- X* y* s" ]
}
4 T9 v0 d, u$ _" j$ Q c" j */) u3 V$ \8 j! f
//comment out all methods, N=100000 202s
; W9 t4 q( O! g: M3 X6 b }; c/ t& m7 Q$ R5 Q3 U& y
' Q1 E8 W' A5 P9 j* u) t, ~: ^2 S* k
delete []b1;
4 S9 I3 v! H% L, f delete []b2;
2 Q) S0 I D1 V* o4 ] |
|