TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * ~) n9 ]# E; c* S
8 i* N3 A/ B2 h+ }1 U/ X理了理思路,重新做了一个测试。
. I1 X9 s. _% |; X做了两个 vector 和 两个 float *, 都长 100000
: L3 L2 ^& R( R) h外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 `' D3 \3 s8 p+ g" M# |" M
* X- e( a" W' y$ x+ s k. k" l( | ]内循环试了4种方法,/ h! g$ O# i4 Y0 ]2 I; o
1. 直接调用 vector inner_product 247s ) H ~# j2 x6 J/ L, J% N* d
2. vector 循环点乘累加 237s
. k3 D$ G2 X6 F0 ^8 P9 h3. float * 循环点乘累加 204s
" I1 w& ]; z' s1 H4. 空循环 100000 次 202s
5 P7 a8 T' {5 F+ d" ^4 H6 x; A4 {8 V0 ^2 X# u- T, F
不做内循环 200s* ~8 t% p j3 @% D! S- p
?/ l6 c) D# g. ~$ W7 `
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ t+ s& V( \( a* q3 v g另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
0 A: Z: d8 l+ R# Y
1 P$ Q* ~/ u. }2 k( X+ k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
+ n3 t9 |% Q) I# w/ }- W
; Z# F1 O' O; ^' O$ P. W' j" h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)% o4 e6 C+ {( C: U8 S; M: l8 Y0 I
3 |) t. W- j0 E std::vector < float > vec1(N);
( F, ^& C+ e2 v- r2 t std::vector < float > vec2(N);* j1 f% u2 i y% M: T6 a$ a
float* b1 = new float[N];
8 j4 R3 M( z& v float* b2 = new float[N];
; O" e3 N7 `0 B) \
. c1 W/ D3 S w/ ]* m, ~$ _ for (int j = 0; j < 6000; j++)/ v: F; T3 `5 s
{/ q- w. r6 S7 w9 [
std::generate(vec1.begin(), vec1.end(), []() {1 p! G4 Q; R) `, _
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 u. y: Y' o; V0 d5 u });4 T& R% y" w! ^7 @" y
4 ]- V$ m1 c# b
std::generate(vec2.begin(), vec2.end(), []() {# D: S: e" c1 q, t' k
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# s: \3 J: w: N0 i" X. [. _
});
, K$ `+ j, v5 C% j) H* J9 Y6 G( b' q3 x; `1 x% [
for (size_t jj = 0; jj < vec1.size(); jj++)
1 \, p- \! d2 Q( ~: q* W3 B2 N u' w7 N' | {1 h1 |+ Q% K d- @6 n+ a& u, t
b1[jj] = vec1[jj];+ ]! x+ W3 Z5 f$ k
}
$ |: T1 U3 x, ~ \3 L2 ?+ U6 m, A# F
for (size_t jj = 0; jj < vec2.size(); jj++)
5 R" W7 `. E7 ~6 J {
, R. w+ @1 t& Q5 A' j b2[jj] = vec2[jj];. G) ?/ {* v# B9 ]% c- Z7 J
}0 J4 S7 D/ b% Y( J5 b; c
# _, }2 l5 g. a0 L1 L
//Method - 1 N=100000 247s
/ a' X4 g l- m+ Z+ o f) c //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, ` h6 T4 H1 C2 O4 f, B " v' r. U3 ]7 ], f( q1 h9 ]
//Method - 2 N=100000 237s
4 O1 w2 Y6 \' {7 W$ p$ M /*
+ A( [+ Y# Y4 ~# _( n4 h for (int jj = 0; jj < N ; jj++)1 K. q4 g, ?* ?3 T8 f" ~( p. d3 c
{4 P2 c0 o5 `: W: P( c4 X" \
fresult += vec1[jj] * vec2[jj];/ }0 M2 o* ]+ X3 A
}$ K* f2 ~5 @8 J6 X7 {
*/- C" ?( v+ j; Q. E
) R7 V/ W; q; C' N8 s, v //Method - 3 N=100000 204s
: B5 a; t6 q( y4 m6 A! B" d/ r /*
* H' Y; g% x3 J3 s, x8 ^* { for (int jj = 0; jj < N; jj++)/ b( G( z- q: A( Z/ w
{2 e. T/ m# n* |
fresult += b1[jj] * b2[jj];2 v3 _3 `: ^! X
}$ I7 L. L0 J( d1 L3 R- p% Y- l
*/* S% X# R7 t F7 c1 v
) f4 V% A }& q2 V, l' z( S. Y
//Method - 4 202s( @- U; D$ a* m Z8 U
/*
. I# L# p0 F5 p2 o for (int jj = 0; jj < N; jj++)
9 R' \ y' t/ \, `/ Q: C S+ t {
/ A5 l" ]5 T& K' ?; p
/ E* c( E u% D6 }. Q/ h1 k3 W }* ]. [9 d C' q! i: _& X' S1 u/ U2 e
*/- S) _1 @& h2 J
//comment out all methods, N=100000 202s , F9 T% _; B, `5 @; {
}
8 H) g2 P- B1 B4 G8 R
3 p) J0 R; l( A delete []b1;
\: p& j9 t" I; l8 `. F delete []b2; ( _6 b- X1 U3 d1 c8 B
|
|