TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 y- N) o1 v& k6 C+ V0 H! j1 l
% o+ R( O P; w( n理了理思路,重新做了一个测试。
, ^. r; g: m4 e' d! z- M做了两个 vector 和 两个 float *, 都长 100000& S6 \' R' q$ z. u) {0 ?7 R
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.- ]% t) W- p' b' [( E' K9 @
) f/ O1 n* U a9 o内循环试了4种方法,$ a* L0 [% _- B0 ^& r4 B5 j* _
1. 直接调用 vector inner_product 247s ! e0 z9 N. h+ z0 o; u' M' w. u
2. vector 循环点乘累加 237s0 |) T4 {: `" f F4 N+ N
3. float * 循环点乘累加 204s
' y0 `. b6 V* t; N3 ^, i4. 空循环 100000 次 202s
+ b2 z- F. I7 j5 j7 k0 ]* B- d" |/ N, h, w b# `
不做内循环 200s1 f* {8 P; g S1 L" J! p. {( }
' o0 g+ n' {1 ~ E6 h" u
你昨天说的对,内循环本身占比是很小的,大头在其他处理。* c3 [; d" ]0 `- Q& E7 G
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 z$ R1 w2 o# n+ q% L
* L x/ F; |' h至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
) d% D. f# i& U. a
" q: G- ?2 r. e% S/ Z; x5 t(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ y; P: P9 Z: l- ^
: o5 U5 t8 U. j9 T' \
std::vector < float > vec1(N);+ x& y7 ^: f- V$ v% x* `: K; b
std::vector < float > vec2(N);
, s. o' R& h( R; t4 }/ s7 ~ float* b1 = new float[N];
* l! N* b' ~9 \7 E# A4 a2 C float* b2 = new float[N];& S# Z$ e! q: U, f2 G; J! w
+ }, c0 v4 M! S0 v+ B! D for (int j = 0; j < 6000; j++)
8 E/ y; e1 x7 K/ c# N) k+ A, \ {1 p9 H, _7 P ?! j/ R- h/ {$ U
std::generate(vec1.begin(), vec1.end(), []() {
. R: M" i4 i* K# [7 Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% A% d, p' ?3 X" m! |% `4 W! L$ [
});5 y; Y* \& f; I' G- \
7 L, A& s" }1 e
std::generate(vec2.begin(), vec2.end(), []() {
- t j* b7 h9 x7 h, @& H return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 g s. n5 N$ }
});
: R' \/ B. b' V( H% D6 E- V6 Y( u+ o0 j5 l6 _. o7 Y0 X
for (size_t jj = 0; jj < vec1.size(); jj++)! d* `& Q4 @% {9 ~
{: I8 T) n& x0 G/ [! f
b1[jj] = vec1[jj];5 B# b) c; J3 a- [! S j5 z8 g
}# s9 p7 P9 H8 e
8 S' s7 b# f W% B/ S- f5 Q+ o for (size_t jj = 0; jj < vec2.size(); jj++)
/ O$ e! t `/ D {9 ?9 Z( M8 e3 k7 A* e2 G1 I! ]
b2[jj] = vec2[jj];
4 N: Q9 y2 T1 g, O. g, Y }
# w# N+ ^% i' L- }4 k! y' M3 O+ F9 v* u2 o D
//Method - 1 N=100000 247s . R; |% E9 E8 n2 Y3 V# J# \
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 O8 J. R+ y- L% ]* N ! [/ {6 S' r3 f+ d& }$ D
//Method - 2 N=100000 237s
2 E$ @( a8 A, e# M9 G$ o /*
1 Q! w7 f" y9 a for (int jj = 0; jj < N ; jj++)% H: d; ?) \( _) ~2 E% ?1 R
{* j1 O9 O2 j6 a6 E# H$ x7 N
fresult += vec1[jj] * vec2[jj];
, i( [& x% Z* L2 D }
2 y: {9 S1 a$ r) D1 S */
D- a: b& r% F1 \/ t
% @! v/ N& f, R4 U //Method - 3 N=100000 204s6 e: A! D7 q7 T+ v
/*3 a1 F {/ _) O, f l* K
for (int jj = 0; jj < N; jj++)1 y4 j/ `# f6 f( l% q8 K X) F
{7 z% s( v, ] z E
fresult += b1[jj] * b2[jj];
# u. s, x$ w% i2 y }
5 N; k6 j1 _3 i- Q */ a+ ?) \8 I( _$ ?& t. w
0 i/ r2 ?4 }6 w$ H8 x# F
//Method - 4 202s
+ g0 _2 R9 n5 C4 L( Q. X' K# s /*
; e) N) C9 Z8 W# o# ]2 ` for (int jj = 0; jj < N; jj++)
& w: I E# n, B- x {
; ?$ k; {( d: _* p6 @' R
1 P6 g4 {' H- b }
+ b$ K3 V0 \4 F. W; w8 F; t */0 J/ o# c4 d" w* I6 R, E4 s
//comment out all methods, N=100000 202s 2 a. ~! J% l; p+ t
}
4 o& g4 X6 F9 L/ V" n
U' R* l; j# F( h0 e delete []b1;
" B+ i; w- s3 y. W) j delete []b2; m& z; G0 o+ r; l/ D" t
|
|