TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ Y1 s8 c. y5 s, x" @/ \) \6 p" h | R8 |9 `. N
理了理思路,重新做了一个测试。
; S; C0 l) o9 H8 _. S, `做了两个 vector 和 两个 float *, 都长 100000 V v; \! d& t* Q1 @
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
# {9 W5 |: {" D0 e: F$ E f3 q$ ]# B, C
内循环试了4种方法,
( r2 c* P) ?/ ~1. 直接调用 vector inner_product 247s
! I6 _& M6 T9 t/ M# _2. vector 循环点乘累加 237s
; F/ L# d& g. B+ @) [ ?3. float * 循环点乘累加 204s0 I; f" k3 B! y# {* b# K
4. 空循环 100000 次 202s$ y5 T8 _6 R# H) J5 R( `* _+ J
# O Q& X) n8 C4 S7 d不做内循环 200s! Q% {) t0 M) g- _: V
8 o4 e. Q+ W$ {8 G8 x/ U你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 V- I& S% Y4 i) [
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- p& z* |9 {% t, h) V( P) i7 @( t+ B" K, }) f
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
7 C2 T5 a# R5 G' l) O" G, X! q3 ~8 l/ m, i: r. |
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). {" K8 Q0 g4 x w4 f+ ~
% E' q2 @; V5 D$ h# |$ t3 J3 V std::vector < float > vec1(N);5 ]; X! R5 {2 ~' l7 `& f' S
std::vector < float > vec2(N);' J6 Q7 g- ~" C8 w
float* b1 = new float[N];/ `/ _( ^# z: W: C
float* b2 = new float[N];# G9 H6 o$ a2 D9 |7 k
9 ~! z- ]; d7 d. k! [, c1 w
for (int j = 0; j < 6000; j++)3 K8 k! N7 w' i1 x
{
/ k; T4 W7 ~# q+ D' q# y: V std::generate(vec1.begin(), vec1.end(), []() {) H* Z* f1 n+ ?; C1 P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, x: N6 o3 q! o5 U/ b4 \3 \
});- r5 L3 d1 S' B
% A( D3 C* w& `# q6 X/ c8 } std::generate(vec2.begin(), vec2.end(), []() {
6 N7 F5 w9 F/ ~7 I \ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, F2 ~* n9 ^# i) X- k* B! ^ });# x G! X; d8 r- A
3 e8 K R6 o. Q/ `' t: m) c
for (size_t jj = 0; jj < vec1.size(); jj++)
2 A- ?$ m5 n! w4 ~! @3 z {' c; @' D( }0 ^- ~
b1[jj] = vec1[jj];$ a6 Y7 x; ?, z% |2 o% N/ ^
}- O( V: l6 e3 C( J l' A
4 G4 A+ k* y- m4 J9 G8 s; u4 h
for (size_t jj = 0; jj < vec2.size(); jj++)1 U0 x9 o6 B |( M; v
{
/ ~% T- z5 @' ^, d/ I8 z. V b2[jj] = vec2[jj];
* K- Y/ s, F8 S* S1 A }# {" o# d$ `$ a9 w3 I1 s
6 k: W7 j" ]3 U& [2 C //Method - 1 N=100000 247s , b( _3 m) X/ f0 _; b" H
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; ~" V, }& W3 Y( y5 O: @
- v0 r& x2 }5 m6 i" L/ w1 A
//Method - 2 N=100000 237s$ S2 w+ b E$ v2 h9 l; }& I
/*
" h9 r, u' Z7 K3 W: H for (int jj = 0; jj < N ; jj++)
' p( {1 f. T, y: c0 f) ^. U8 t {
2 v* p- ~' {/ u" R7 C# n( f( _ fresult += vec1[jj] * vec2[jj];! p$ s0 f! E8 o( D* W8 q6 \
}1 Y; h/ _$ m$ k3 `1 \
*/
% S& u9 r+ d; l& E9 e0 o! e1 G * L. ?& z) f4 D6 e, M. ?
//Method - 3 N=100000 204s
# v! s7 D$ q, f [ W* b2 u /*
, |9 \$ z& o! K3 @" S+ N for (int jj = 0; jj < N; jj++)
/ m7 T- [8 A0 f3 o {! E. G5 r# Q- z9 j
fresult += b1[jj] * b2[jj];
9 c. x l3 I& U }- y/ G( v7 z" D; z. f* C
*/
/ G) l1 k+ L: s& }6 x8 n! n$ ?; Q* X7 y( J/ s0 N0 F
//Method - 4 202s
$ p: |0 w0 ^8 A /*; K1 J' L6 v8 k% G6 Y ^
for (int jj = 0; jj < N; jj++)
3 {: i3 }1 S; ^1 }/ K" c {
& n/ U- g: n- t( M7 k " N Z" ^( t8 {0 X6 t) b. _1 d
}7 Z# a8 V9 Q( Z: @1 `0 _
*/
7 ]( u% t# X, f- S' X' Z5 v; g //comment out all methods, N=100000 202s
0 Q/ D' U! x. v# X }1 Z3 G& o. j+ B
6 N5 Q! v) Z6 h# g% J8 S9 g delete []b1;
. H5 Z6 b: e0 Z: D6 J$ Q k delete []b2; * n: n* u) L! d" z: ?" n
|
|