TA的每日心情 | 奋斗 5 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
# k8 F" K3 \+ ~2 x
& _! O# z, @; h: P% w3 w理了理思路,重新做了一个测试。7 D, p( o. r5 m5 z5 O3 ?$ Y) W& H
做了两个 vector 和 两个 float *, 都长 100000* v. J$ |" {" i
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.- b8 n1 }7 R9 V
$ q' h0 J6 g8 h内循环试了4种方法,
0 p% m+ K+ {+ v& d( L1. 直接调用 vector inner_product 247s
6 ?- J. { _- w- g3 D' u2. vector 循环点乘累加 237s) k+ s$ m$ x* ~0 s( n3 ^
3. float * 循环点乘累加 204s- m9 I# [3 l% u w5 V
4. 空循环 100000 次 202s
2 U' z; S2 Y: d7 r# \+ k. K, O! {3 c
不做内循环 200s
( L$ R3 |; y N- M: K, X$ |
1 [) ~( X6 [# x7 t" y; D# ^) o你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ u& y1 F: r, z& v5 m2 M8 N( R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) C r0 |4 @0 U6 Q
3 s6 I2 O" G. r, T& E( b2 ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ f2 ~! \$ [+ K2 k. P6 S
8 `( _. X. R! S% t8 G: B, x: P
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* N/ `- h y7 V
# b- W. b* T; b+ C* X# s std::vector < float > vec1(N);" b! h+ A% b4 J
std::vector < float > vec2(N);
/ L& S3 Z- W) t7 K! z* @1 w float* b1 = new float[N];
& i: u- T- o! g t0 U float* b2 = new float[N];$ x) g& g2 i! P
) L( N$ F2 d& D3 Z( a* L/ |5 o' C9 q
for (int j = 0; j < 6000; j++): d2 ^! i6 |" O
{" ~8 {8 N5 b& u+ U: x" W) s
std::generate(vec1.begin(), vec1.end(), []() {
2 J3 ^+ Q4 g8 u! N5 |6 X( O; r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 ^) S* s @/ A, P& Z- _
});8 D e8 _) T+ ~) ~) i/ D
C8 w8 B6 Q! A5 X6 ^5 { std::generate(vec2.begin(), vec2.end(), []() {' z9 c# c4 ^1 u$ I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
# z! \. B7 z( w. T });) y) H. S. q& c6 Q9 v
8 m d; |8 B$ z6 A8 M# V5 i0 n1 } for (size_t jj = 0; jj < vec1.size(); jj++)
+ j, J5 S% W& q {
* z0 Y0 x6 _/ R: |- v8 ]2 ]/ f b1[jj] = vec1[jj];7 y* p, ~9 ^# `$ R! _% C B9 Q
}
+ j9 C R+ \: P. w4 I0 a: R8 y! |: V9 U w; R+ O& [0 ~& v% ?# H
for (size_t jj = 0; jj < vec2.size(); jj++)
* D% o9 N# J: [. S+ B {0 o8 u& O1 p0 e7 b
b2[jj] = vec2[jj];
) D; F+ G2 V3 A" q }
7 W' H* u8 x& v- S% v: J* A% k, X }) r6 g. i O$ G# l
//Method - 1 N=100000 247s
, q( i2 {4 |' ^- q+ ^ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
# {- d% d4 F: k( k
Z: o; C9 j7 s4 Q: | //Method - 2 N=100000 237s" D2 k+ | c6 v+ \ k
/*3 o+ H# F' `8 G
for (int jj = 0; jj < N ; jj++)) ?1 Y; M0 O8 [# a/ d
{
2 L+ j8 b( a. h, ?2 Y3 P fresult += vec1[jj] * vec2[jj];6 S4 w0 C7 X3 e1 T
}
" i y2 w1 J- U9 l- ^ *// K0 n% Y6 T; _. L! O
+ e ^: |4 F( A1 K( ? //Method - 3 N=100000 204s
6 l* B5 k! W A /*
& A H" t m* j for (int jj = 0; jj < N; jj++)
% I; c0 y9 K8 H& v% { {
+ l) K( t7 S5 Q8 p: }$ O* I* n fresult += b1[jj] * b2[jj];
( I* v/ V# k- m( ?7 o. W }
/ W @- c8 n* Q( g8 s0 c; E */2 h7 b) F3 N6 F" E0 s7 t
1 K, S# {$ P- i. ?8 {
//Method - 4 202s, x4 L4 R$ Z$ m+ x$ E7 D
/*
+ g% j0 j! {! `$ N for (int jj = 0; jj < N; jj++)
$ p: a/ ?' \. q6 o; e% Q6 b {2 B D$ u2 h' b I! h
. c8 Z' R+ w' w, Z# b# |
}& Z* Y% x* f9 {8 A
*/5 ^, g: {6 A! `, ~6 F
//comment out all methods, N=100000 202s
6 _, B5 J& ^1 {# P& G+ ^2 g }9 ?2 g& c" k+ _+ l# W/ u& m3 G* |
4 A# t/ B) ]" o. L% W5 O
delete []b1;. g, f3 l/ \/ H6 {
delete []b2;
& k6 ?: s4 \& t* y7 d1 j, c4 s5 J |
|