TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 s& ?& i, x* G5 ?! D2 R( |
2 r8 }* c; q* Z理了理思路,重新做了一个测试。- U4 J% i; P: ]8 o( |
做了两个 vector 和 两个 float *, 都长 100000
4 R" p& y, c8 `6 b% J9 N外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ C) z% L& I' N+ d1 o" z% q
2 W1 T' `$ Y9 g4 t9 h内循环试了4种方法,
* \9 t8 t/ E8 \: U: q/ v0 J9 ^1. 直接调用 vector inner_product 247s
+ i3 |; s7 p K+ C2. vector 循环点乘累加 237s
- ^8 |2 z: p2 R' X: b3. float * 循环点乘累加 204s
& v8 G! y- r! V; i4. 空循环 100000 次 202s# q6 R# x4 O2 d
# A6 o' C' D* w# Z! {8 z/ a不做内循环 200s
) f9 M2 g8 c' w& m4 C0 k3 H+ p
; s6 B& c: W0 e; j$ {! w你昨天说的对,内循环本身占比是很小的,大头在其他处理。! B6 ^+ D3 _- {) \
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- z% l" {9 o4 I1 T- ^
& @" m* t; S9 x: z) C至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( D6 W4 S8 \$ e* w' T
0 r. h% l# a! _3 t! |* B4 H9 O9 p(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
/ m6 Y e& c0 e& v2 \1 b! P4 q% x" e* @2 W
std::vector < float > vec1(N);
6 z/ V& E- j2 o$ C( |. Q! C. n& q std::vector < float > vec2(N); F9 K. j: g. v8 \( X, Y. W
float* b1 = new float[N];( C- e4 ^8 [5 ?" |/ R- G) x. b$ p
float* b2 = new float[N];
4 z3 O& s" w5 y
* D1 Z; V1 P n9 r for (int j = 0; j < 6000; j++)
1 G# t: X# r% d0 i% q {
- g! _; j' z3 F1 D9 k5 [ std::generate(vec1.begin(), vec1.end(), []() {" D6 V, C6 I( M% q" ^. y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
1 F G/ ?# r$ t: b( D! l });" U% ^6 D" |$ H, Z8 U5 Y
; {4 {, R4 o7 f0 I, ~0 @7 _ C
std::generate(vec2.begin(), vec2.end(), []() {( a; a% F4 \# u' ] u# s* _
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
* A6 C$ H1 J% j });
* S' R0 G d3 I" K# `5 W; w% S
6 J, Z4 u; P4 L5 v for (size_t jj = 0; jj < vec1.size(); jj++)
+ l3 j1 p" O, Z {
0 l+ k4 Z- G4 r0 l# W6 F3 Y: e b1[jj] = vec1[jj];: {9 E1 t0 g5 l$ A; U8 ~6 O
}
, H, X2 ^# `4 ]* ` K; ~3 h+ x% c( w& Q0 ~# E5 U
for (size_t jj = 0; jj < vec2.size(); jj++)
( W* i$ @% {1 D' A5 a {. z7 p0 o1 J! Q8 S
b2[jj] = vec2[jj];. Z5 y( x% u" J
}
9 v- P$ z8 y3 \" O/ ]/ l
, {3 p/ Q& U# {; h //Method - 1 N=100000 247s ; k6 N+ \* @, |+ m* [1 H
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% \# f3 |# Y/ E9 g+ l! e O
6 H. c$ X5 D' V! L5 E1 @& [ //Method - 2 N=100000 237s) P& `9 E- E/ h% N8 _! L4 x
/*
# ?* j7 B' V" P1 x0 o. k; ~8 q for (int jj = 0; jj < N ; jj++)2 M2 s1 W8 S8 r+ o- g
{
( e( ~& G8 T- o* \ fresult += vec1[jj] * vec2[jj];) O) n( L$ q. [* u& N
}
& L$ t- L5 y2 V( V */. R/ E0 m8 ~+ c9 B/ K% ]
- o( ?5 a* ^6 v
//Method - 3 N=100000 204s: Z# X4 _* f% x( ^. z
/*
7 L5 M8 X; q- y for (int jj = 0; jj < N; jj++)9 C+ H) \0 @% n7 B
{
8 R0 P- t( P8 p, L+ ^# [0 Z1 c fresult += b1[jj] * b2[jj];
1 Y3 T# ~. J( y9 z }! I( Z7 e) G" v
*/
3 `* [/ }- p4 C6 }! A4 n5 B( ~& F+ _. _4 A7 @& ~
//Method - 4 202s
4 Q8 v! E# _0 @# B5 \' D- p /*
& ?) Q' R4 A& j! R; {" Q for (int jj = 0; jj < N; jj++) u" I: d7 ]' @# V! ^
{
& W4 g2 O# x7 g+ k6 K `+ ^ 7 X, p8 v0 K# |0 e( M# h
}" g, u; ?: N& k9 K' ?$ u
*/' ^ k; R# U0 @& u; G
//comment out all methods, N=100000 202s
' l/ H" |7 y4 I9 n' C( h8 d }
' w: p% R0 W/ s( O7 E
- O# S3 X! j' A! x6 Q delete []b1;
, K2 t4 x/ R' u2 b. S1 Q delete []b2;
; _' x- L& L& N2 `: z |
|