TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
. w- H: z( g3 M' b3 C" |1 Q/ u% f0 E- R% \
理了理思路,重新做了一个测试。
1 h p- }! n3 K6 K. C做了两个 vector 和 两个 float *, 都长 100000
7 |5 Q/ v. R& m0 P6 a8 L( t/ L# l外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
8 B6 p* x# W l- O L) L( ~8 \, t6 q) k
内循环试了4种方法,
3 U4 K6 ~* J* o) B1. 直接调用 vector inner_product 247s 1 z3 [- \8 |& O
2. vector 循环点乘累加 237s
4 u3 u& @7 Q6 `! L& l3. float * 循环点乘累加 204s' E% _4 I, U1 v. p0 H$ _
4. 空循环 100000 次 202s! H9 g: E- } B. K
9 ~ Y( N3 ?$ _+ `
不做内循环 200s- E" Q& n4 E' N9 z
* m+ U- R- c( X; O
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- E' Q( X6 ?. K" n! G另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ Q/ u* p! i z2 }6 a
3 q4 \& \6 o* m1 s$ v% p至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
" J* y2 T0 V7 r$ {/ v( n I* K% |$ W# l# |& ]' M
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
. R" s: n! J$ G% z( p. B1 N/ K9 K x1 R* P( g
std::vector < float > vec1(N);
0 Z% e7 {3 `! d8 a std::vector < float > vec2(N);
8 c/ X* W1 I1 s z float* b1 = new float[N];, A) \$ G* X# K& {* B. F: [- k
float* b2 = new float[N];
+ z6 w5 M& l! P0 \6 X: H8 I5 X4 O- `$ E5 x; I
for (int j = 0; j < 6000; j++)4 x$ I4 m: k6 I! j; v6 L/ Y
{
+ h4 o2 V, f, p( l: P5 ~ std::generate(vec1.begin(), vec1.end(), []() {! A9 p" z# [. \8 a+ L$ m9 u* A, w7 L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. f- Y& `7 P _3 b; q2 N
});
6 y0 X# x1 g5 b% q; A; T3 f* ?/ W
std::generate(vec2.begin(), vec2.end(), []() {
9 W2 ~; i; ^* N' Y8 n( ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& r0 f4 ^% q, n* |* P });& ~" a* A" u* N9 M4 ?5 S
1 u/ L' _; {7 E& {- i( t7 w4 R
for (size_t jj = 0; jj < vec1.size(); jj++)
- A# W) h9 R5 O9 \+ b {6 J0 Y+ R u# r9 o. W" F9 O+ l
b1[jj] = vec1[jj];
/ c" B4 O6 x8 p: ] } f1 S$ ]8 X5 N# ^1 n' r
& t i# ?6 z1 O( F- y8 O" X. Q2 Y
for (size_t jj = 0; jj < vec2.size(); jj++)+ R8 Z! H$ P l1 n k
{
9 f4 s- C: {$ x J) ~1 K$ i b2[jj] = vec2[jj];% w* }: C" Q7 {5 `$ C: E- S+ e7 \
}
+ d2 ?, J" c+ G$ @" ]$ H/ G' |! d. \& Y4 D/ l% D$ {( G
//Method - 1 N=100000 247s - m# w5 p! [& _+ }* ~: s! _- w: O
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ o0 O6 W& l: x+ q/ O' Y5 H
& M2 s( p$ V/ W. o v //Method - 2 N=100000 237s
9 C+ T5 [- g' ^ /*. _. \+ x8 W; v, A
for (int jj = 0; jj < N ; jj++)2 v/ ^& }7 t* @: W7 [" l
{2 O' ?1 @. I# F
fresult += vec1[jj] * vec2[jj];8 V1 F0 E* j- k- O& ` R5 C
}# I7 m: ?7 n7 S# v5 L
*/
3 r3 c! f% G) t; r$ I" n
( d2 R5 @6 {2 F //Method - 3 N=100000 204s9 _0 W4 U1 B: ?. d' |) t8 O
/*
: w; X. F9 s# A- N. v2 J for (int jj = 0; jj < N; jj++)
2 C& _6 f; F/ \! t0 Z; @- I4 w {4 z) n; U" n% E I$ ?, D, X; ~
fresult += b1[jj] * b2[jj];
S# z% o' q& w }" }1 {0 H2 u8 ~! f3 y2 A3 X1 Z
*/1 `8 \5 e0 E" _. K# L2 a
" r- {3 Q ]/ h5 o/ v4 A) O6 C7 H$ W
//Method - 4 202s% g6 W3 \, I' G3 U$ j
/*
) N) I$ ~1 T( [9 O: o$ c' b9 ] for (int jj = 0; jj < N; jj++)! u; y: R0 j1 J, h$ N! k
{
" [% @7 F) O# v$ j 1 z% h H/ C. G( A6 |
}
8 E8 A# _/ y" |% l. ` */
# Z! X" j" j, P; Y0 Q! B/ G //comment out all methods, N=100000 202s 4 z& M0 |7 N" L; K% N
}
6 ]' R) H) o; n% p9 D2 y$ A" _( j6 }0 ~2 U/ Y% T
delete []b1;
) |% r6 V1 S$ q' p, P$ y: `7 ~ delete []b2; . w' P" \/ M/ L9 Q8 `2 h- F
|
|