TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
7 k3 A( F1 X$ {/ C8 @* X! x7 M- a2 C7 e3 H5 o1 z
理了理思路,重新做了一个测试。* U. @+ x5 U- X" G7 G
做了两个 vector 和 两个 float *, 都长 1000007 g! P9 A ^7 ~
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 ]0 {6 C5 N, A& U# t# A! s4 h8 ?/ E" ?
9 J c$ X: T5 B内循环试了4种方法,
2 d. e9 l. r5 M' |+ z6 N1. 直接调用 vector inner_product 247s + Z& o* l( k% S [% p
2. vector 循环点乘累加 237s
4 k6 \6 _+ H6 p0 {5 ^: ?! B/ `3. float * 循环点乘累加 204s4 G9 B6 e4 `4 ~5 m1 K" G7 O
4. 空循环 100000 次 202s
: D E9 K: ^" U* t9 i$ i0 A5 \, p. g7 P, v `% W3 Q- p
不做内循环 200s# y+ M# X) H9 O! l5 t
, k: E3 @/ X/ r7 ?8 G. X3 E: [- n你昨天说的对,内循环本身占比是很小的,大头在其他处理。" ^. z. o4 r% K5 h
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 J+ x- Z/ K% w
" ^. N( {5 s0 F
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 i+ k. Z- [0 @9 E0 R8 t
6 U9 s% D- L8 o5 z- R# J0 o+ c(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 W3 p7 z$ a8 z5 ]) N# I% h' C$ N. v% ^! o: E; S
std::vector < float > vec1(N);
( a5 f2 z6 j* Q0 w5 p( c std::vector < float > vec2(N);" \+ K2 H" C. \7 P; `
float* b1 = new float[N];; E+ ~; O! H" |' T
float* b2 = new float[N];
+ S: }" v% d# _3 _) E$ K( z W! t" {: ^
for (int j = 0; j < 6000; j++); H7 [+ K! |+ k0 A3 E8 A5 j
{, o2 w/ x4 R5 p0 N. z) p
std::generate(vec1.begin(), vec1.end(), []() {
( h3 `& ^$ b9 N2 D! o$ T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 \0 ^) s" N8 K
});
/ {+ h0 o$ l' ]7 A
1 _$ q& U& }4 E std::generate(vec2.begin(), vec2.end(), []() {
& f8 I& U9 r% p! `3 f& ? return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 \* _4 s! e* N/ {% w% ?
});
7 f$ a5 L. S2 \% F, I* _4 g$ |5 l7 }; h9 ~. a
for (size_t jj = 0; jj < vec1.size(); jj++)5 p$ t. B3 Z& P+ ~* s" E+ L
{2 ?; J4 V/ X0 ], ?& ?
b1[jj] = vec1[jj];; r4 z( Y, F& t. a4 N# d7 ?1 ~9 r
}
% m/ K" q7 C) O0 ]9 r2 \& }/ l( H% J/ e" j1 x6 \+ w2 ?
for (size_t jj = 0; jj < vec2.size(); jj++)% z9 L' B' O* ]
{. _; R. [6 E* q' Q4 a7 ~9 P. e
b2[jj] = vec2[jj];
4 {0 w/ x8 \' L! D( ~ }
+ ^: H W6 X$ j6 Y6 w) ^: p
4 x2 S7 q, v) M$ b //Method - 1 N=100000 247s
8 j* V& n, ~% {7 e //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 f' o" t: b1 k6 l3 f8 ~
8 Q* l& T( W4 O# E- t* j2 Z: \2 N9 }$ M //Method - 2 N=100000 237s
4 W' v2 \ r( T+ ` /*
& x+ d( u& U7 N, [& y8 Q3 D for (int jj = 0; jj < N ; jj++)' ?! |1 z) {7 A7 }# a$ F# F2 h% l
{
- ^5 w! e$ L: L& r; H fresult += vec1[jj] * vec2[jj];
( A+ v, w1 Z2 f2 t( {' M! m3 | }
6 Z, d7 U( S7 m; ~! ?2 w */
1 p* D$ {' e# S, s2 X7 [ ?; @4 D
% r+ q; s3 I4 F$ g3 D. m W //Method - 3 N=100000 204s
6 n H u# g, A- P /*: X0 a% }' W6 Y" f5 I: N- X- v
for (int jj = 0; jj < N; jj++)/ a6 c* G7 R% J% ~! G4 F2 m: d+ ^
{
9 X: ^) c ^# @8 Q( V- P) h! u; {. N fresult += b1[jj] * b2[jj];
1 K" E; ~) c8 I0 V }- [5 _$ t5 S) I. E3 v. C K) A
*/5 \2 Z" `7 ~9 Y( i0 A1 i
4 }3 D9 P+ Z/ o0 F) a
//Method - 4 202s
4 Q& F! D6 d i6 k/ ^3 A /*
8 K0 V ` o1 s/ J) f* U* ^0 S for (int jj = 0; jj < N; jj++)
" J2 M% E q; \- a% ? {+ J; _! B/ H$ v
# G: x1 i, k0 R* z: h z6 ^+ m; s8 H
}& V! q J; C/ |; W# [
*/' ^0 R6 Q+ d: o
//comment out all methods, N=100000 202s
5 D' i" S5 O& J# Z }
5 Y: U7 T% z/ s/ A3 o$ s+ ?4 [9 X! R1 J
delete []b1;
5 C7 h* v8 i+ b3 l6 `: |- @, i delete []b2; 0 _+ M8 q' F. q. s% O$ b! Y
|
|