TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; @2 `$ [1 Y! P& j5 P$ @6 [
; d) B* n7 |+ d理了理思路,重新做了一个测试。; B, s Q" B: T
做了两个 vector 和 两个 float *, 都长 100000$ `) n0 }$ `1 l% z
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: j2 A% x! y# J$ e
% e3 o& e8 s' K0 Y# H6 i0 D
内循环试了4种方法,( Y2 Y$ X) H2 u) o, k0 _$ k
1. 直接调用 vector inner_product 247s
+ |' Z1 G* K2 X4 [# R5 V2. vector 循环点乘累加 237s5 I6 j( {% s, F" j0 B/ K1 u# k
3. float * 循环点乘累加 204s( U! F1 y- z+ F9 n! x& W1 W6 y' r
4. 空循环 100000 次 202s F6 l& J' ~& v% S/ [ n3 g" p5 V C7 n
K& \9 J8 [* `$ Z! [+ p
不做内循环 200s
! v; c. R3 C8 {7 P) m
: t5 }- {! z( D2 \7 H6 D9 I你昨天说的对,内循环本身占比是很小的,大头在其他处理。
F3 n* z# E& {" t/ H另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ f8 |8 z5 J$ X, `9 _" Y/ F
5 e1 W; R8 q$ d* L/ l d k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
* l) l0 x; w! Y/ n
# L0 |8 N2 ^8 r3 M/ \/ O(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), L' ~; K: C! C+ W# I" P
2 n5 m+ G$ {* j& V m, w
std::vector < float > vec1(N);
, \# A( s! g9 l7 {; C- T std::vector < float > vec2(N);( ]5 b6 x6 P% H
float* b1 = new float[N];
% ?3 Y" q' }6 f! _" \6 t float* b2 = new float[N];
5 H- d) j; I, J' W0 G% ^3 c, ?. B! y" T5 i# i* v
for (int j = 0; j < 6000; j++)
, D0 V7 Y7 ^- A8 b( J8 f/ z- { {
2 A( @1 a) l7 W6 l; h std::generate(vec1.begin(), vec1.end(), []() {! h; M' j1 B; n1 O& u
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. ]: w5 c. b2 x8 x. ^# q" p; F
});
# x. S* y) x. Z: D3 ?( ~2 A2 X& T& A0 h0 B# l7 Q
std::generate(vec2.begin(), vec2.end(), []() {
9 g& E6 o8 ^) ~# j3 I/ [ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ O* d/ d! B0 E5 D0 u Q* \5 y; z
});
1 M! x+ ]9 m8 k; F2 b9 q1 w) |! d1 J+ Z6 b M0 v' i
for (size_t jj = 0; jj < vec1.size(); jj++) h" v r' \0 X) R8 H x
{" j) u$ g: {4 c! N0 G- f% C4 y
b1[jj] = vec1[jj];
; F9 c5 P# R! j& K' J! i }
" d6 i# S7 l/ y4 T6 A
0 g2 N6 M( O" T& @7 J for (size_t jj = 0; jj < vec2.size(); jj++)' o; e/ S' c% L$ Q, l! O- q
{1 p5 w, |6 n1 s8 M. k L1 c
b2[jj] = vec2[jj]; u& `" x4 O9 V# b4 f
}
! w% Q4 E, }0 Y0 @, A5 b) v
0 C ] ]( ?, b- }3 u/ z //Method - 1 N=100000 247s ( l. `0 ~0 X2 Q
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& R9 u* ?6 y1 A$ H* @+ ^5 K& c
4 f4 J$ |8 W6 Q, A //Method - 2 N=100000 237s
4 g4 w8 U. l( M; t8 T& K /*
5 Y( i; T8 x. t% M, n, d for (int jj = 0; jj < N ; jj++)3 `+ F7 d; J& p5 O
{
. [0 [ Z& y$ S7 \ h/ H fresult += vec1[jj] * vec2[jj];) B1 W6 |: i' a$ V- L, A
}
' ~% E: ^4 G' g: v# ]; N6 ` */0 x; _; \( @5 b4 C! s
8 A9 H8 G: ?; L7 @ ^4 S4 T) P3 S8 D //Method - 3 N=100000 204s
& O# @, X8 v |" w i4 ?1 @; c /*( Z, R+ M6 \( O/ g7 P4 m; U, @: U
for (int jj = 0; jj < N; jj++)
; |) e# U" }& h# N; l, D& H {! z- R$ d# d7 {2 _; J' ]$ j5 p2 j
fresult += b1[jj] * b2[jj];7 y' V. x* }5 T! j; g
}
% o; ]' g8 R8 ~7 h# D* g* k5 S */
- M" {" r J; ~ A4 ?9 x) }7 M" ~0 V* V- B: U+ q
//Method - 4 202s" c' D5 ]& f' }$ }# |$ Q) `4 Y
/*1 B2 S' |5 A. \& b( Z
for (int jj = 0; jj < N; jj++)0 ^ i0 v" P0 q! N0 j
{
3 g! L% @& v: S( n, @2 @
8 t4 U h- u4 ~) j: s! Z }* q$ k& d6 k4 _ F& T/ {
*/
- Z2 r. V% s1 n, }' k //comment out all methods, N=100000 202s & w( S/ G5 v6 R' ?8 U- N X
}/ N! ^5 G* G# z, c7 `# M
0 q( l n5 t& Y7 k delete []b1;4 j- V5 z: E1 m& g, w; P
delete []b2;
* h3 o& V. h+ I1 S* i |
|