TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' Q, v0 t+ Z# q0 M- D- P+ E) D% l# [! ?0 j4 [
理了理思路,重新做了一个测试。
! Y5 Y, T% T6 z做了两个 vector 和 两个 float *, 都长 100000! `5 k% n- m" Q) h7 y p5 t
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( y. h5 D( O$ V% K9 V |
) B" P i- e$ B8 g! F) c4 _) ~
内循环试了4种方法,
# p: a! c' \2 ^/ p! n- `1. 直接调用 vector inner_product 247s 9 P* C+ R! ^/ @% n
2. vector 循环点乘累加 237s
* A' C5 Z5 x0 r3. float * 循环点乘累加 204s @1 _# J/ d2 U7 E3 A
4. 空循环 100000 次 202s
) k4 M; [! N7 p, ~' I* k. h3 T
% Y3 d1 V% F& w不做内循环 200s; x& t- Z4 A% U0 \
' x) D' q7 x# X# x! n2 x" x
你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 X2 J. x5 f/ Z( F) M% K
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
2 Y0 C9 c. E) s) \
- D2 M3 S0 Q8 I& C# P至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
/ y+ ~7 O$ R! z, a) |( |( R& |$ N2 B' w! e
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 a% Y0 P1 z# C3 W- l% Z' ~, i" e% Z5 t1 }7 K9 @ ?/ O
std::vector < float > vec1(N);% F; H7 e4 |" }1 e# E
std::vector < float > vec2(N);: R- p6 X0 i" }9 w6 R- K1 O t
float* b1 = new float[N];
& d# _* X1 X0 b) l float* b2 = new float[N];
9 q! v0 u; F+ Q$ O4 Q4 B+ ]9 `, Y9 o, Z' ]) U0 [+ H; o3 Z A z
for (int j = 0; j < 6000; j++)
) [% {! }4 x6 x+ p {) l( q1 o6 k! o; T* g
std::generate(vec1.begin(), vec1.end(), []() {7 Y4 @$ t8 _7 z9 f
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 {6 `0 g: T5 u5 F: h) ~5 S });
8 j/ c1 I2 ^: d# y% Z3 B4 M
- p K# M+ O& |& T4 w. ~ std::generate(vec2.begin(), vec2.end(), []() {; h, S2 }3 |# [+ b, F! K- I" g
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 A# w2 @% a' O
}); n7 J: V2 J' p% M; [: m# Z
9 ` H8 ~3 t8 M8 O
for (size_t jj = 0; jj < vec1.size(); jj++)7 U, {$ M9 p7 Y, s( H2 i n4 y0 j
{
' D: b5 R1 A6 l8 a- \# f4 T b1[jj] = vec1[jj];+ |' B) \" E7 Y1 E# X& D" K! w2 _
}
- @# g# b: _5 m6 t5 L R5 v6 [- ^ [6 Y; Q; N# o' @ S
for (size_t jj = 0; jj < vec2.size(); jj++) B, u' y z. {9 X: f1 X; R
{/ N; d' k8 X$ l8 o
b2[jj] = vec2[jj];
" U. u8 C7 V& P* M: @6 M8 K1 ~ }
" W4 M1 ], f& } o, O. l; b: \4 |" X i
//Method - 1 N=100000 247s
6 h% q3 I, ?5 F% S7 a //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
M' {+ J6 G7 b; r9 T 9 D9 ~ A) Y4 m1 l/ F' [# h
//Method - 2 N=100000 237s. Q' h7 ?. Q& g8 Y% V
/*
9 @$ ]6 r5 d! X& Y2 \ for (int jj = 0; jj < N ; jj++)
8 @2 p4 r3 w; {+ ^" R7 R; J2 b8 l) x {8 G& ~0 B. x+ d! X1 Q
fresult += vec1[jj] * vec2[jj];, `. p0 c& P* G0 |7 Y2 o; o& @
}
. _/ d/ _: A0 o* ]$ b */
/ u! d! Y& G/ e7 c1 y 8 \% b- W% S- q$ `, m
//Method - 3 N=100000 204s/ ?" M5 g( t/ x+ R: ^* E
/*. V% z! z. |5 J. g! t) z( r' t; A
for (int jj = 0; jj < N; jj++)
5 {' l5 b) d! S: I! P& u {5 a8 b0 F h: e$ ~) O
fresult += b1[jj] * b2[jj];
f! f5 `1 }/ n( }( Q }" E% [0 @( {. L) I1 I w! p$ L+ r
*/
/ }- {2 K# }, G) Z% x* ]. Q$ Y8 N A$ J- |8 e! j2 p0 g8 C: ~. i
//Method - 4 202s+ S7 s$ S6 g3 n4 R3 ~
/*
$ ?$ l2 Q4 w/ z. v for (int jj = 0; jj < N; jj++)& |# H3 N9 H3 K f2 ]4 j! Q
{
7 L7 N! ]+ ~$ q9 J' Z- `3 I7 K6 H
6 W; x: z) M$ H6 H0 q: s+ }; D }$ x' w- L" M0 g* ?. r
*/! `7 Z% [! `$ W8 D
//comment out all methods, N=100000 202s ( E9 U9 F3 i. H! r/ M, q
}
! r/ ^/ a! f$ i) Y! s
$ ^# c" J2 ]9 } delete []b1;
5 q8 l: j3 X4 {8 t( F delete []b2; & e4 r r( v' l# j7 }! n
|
|