TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - d, O \* n$ e1 L: w' K
* ]! s1 D, I: }5 m) h8 r; d& L0 A
理了理思路,重新做了一个测试。
- d; O# I1 J& z; M. y做了两个 vector 和 两个 float *, 都长 100000% e& r3 X6 B) j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* n( g7 I$ X# P/ \2 h. ?% q
. f: G9 B/ V& S; g: e4 T
内循环试了4种方法,
0 p/ e# k4 c7 s* k& _4 F1. 直接调用 vector inner_product 247s
. t8 F" W; @. K; B) j5 `7 ?2. vector 循环点乘累加 237s$ ]9 q! \9 ~# J/ R/ A s6 M
3. float * 循环点乘累加 204s. O) _( a5 p5 E2 n! g( {
4. 空循环 100000 次 202s
3 m) p. I: o* w- a. Z5 W/ {
6 p. ]/ z" f% t6 Z不做内循环 200s
+ q7 A' @' M: d: V& l& x" V" X8 w9 X% y; ^; s) f* L
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 u! C& E! X8 R* R: Q; W/ G/ N. x" E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: y$ }# q* f5 ~
- C( z2 Y" p) ]! U至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 h# X. l. y! G4 x3 r* w0 F" R; s7 i$ X
! J' z5 N$ @/ h7 q2 d
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- @7 I" V, L9 e2 F* c
2 X7 w9 n, n3 }, V; A3 b
std::vector < float > vec1(N);5 t% o! N) E6 m1 @3 H5 g# C
std::vector < float > vec2(N);# M; W4 j9 Q D
float* b1 = new float[N];# S2 k* b; k; `+ ^9 Z
float* b2 = new float[N];) R6 g- D" m$ o* ?
) }) X: u" A/ b# a5 d8 a7 X+ ]
for (int j = 0; j < 6000; j++)' r H' I3 `" V6 [. h/ P l
{% M( `( M6 c) ~$ f
std::generate(vec1.begin(), vec1.end(), []() {
0 f$ F5 X4 S- |1 d* j& S' l return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. L0 B( K# t7 f( e5 O });2 B2 G5 M4 z0 C4 c8 g1 t
, _! w7 G! @; D' _ w; ~
std::generate(vec2.begin(), vec2.end(), []() {0 p( e6 ?. A/ w1 _' o$ L0 a
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, H4 y5 m5 h) i+ B });5 j- |3 V- y4 D' E0 f
' { p+ l3 d9 G& K
for (size_t jj = 0; jj < vec1.size(); jj++)9 A7 |$ j- t* ~
{
1 V- K& P( j. r b1[jj] = vec1[jj];0 {4 l8 F$ i5 O3 J3 d3 ?
}
6 O/ T( N3 X+ q5 E9 T' C K' i* V: w( k: `
for (size_t jj = 0; jj < vec2.size(); jj++)" y- v, y& a1 N- _7 z
{
: A7 s- ?9 ]4 m% [9 U b2[jj] = vec2[jj];
9 `1 w0 T$ o% E1 Y3 ? }1 p: e* o/ d4 U% x
% j4 {* C6 _& ^
//Method - 1 N=100000 247s
" ]' z* E. P/ ]/ Q F% C1 R4 a1 X //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 g5 w9 h- x7 S; j3 t
4 |7 Z9 X' D* d7 W+ @- ]- e //Method - 2 N=100000 237s: k1 i/ o; E& F9 R, M3 x- Z0 B3 G
/*, g! b: n& n. R7 d; x
for (int jj = 0; jj < N ; jj++)5 |2 n# ~8 o# ~& e0 P
{1 D* @+ @$ ~6 _' _5 J6 S& ~6 i
fresult += vec1[jj] * vec2[jj];. X0 \& v/ S' }9 ?, ?0 r2 F! ]( v; c& O
}
+ I$ u# e+ f# |/ Z/ h */9 |2 A3 C# `+ \( D' ^
5 P3 V$ n8 o1 q6 `9 ]( e. Z1 | //Method - 3 N=100000 204s$ Y' j; P' u8 A! g. [ n
/*
, p0 w" t/ c1 X4 b) f' q for (int jj = 0; jj < N; jj++)
G3 O: z/ I8 l* s2 h {
. [: R/ @. q {6 [ fresult += b1[jj] * b2[jj];- h8 G+ y! @; l- s) |
}7 z7 }9 `0 w$ L* j" ?& i% F
*/8 f- P% o* y/ `* H+ k2 d4 x
( R U0 m K' l( C* U: ^: u/ }
//Method - 4 202s
, K7 a7 f6 t( I. K) R- u /*
! R; \ q% m5 V! D for (int jj = 0; jj < N; jj++)5 D1 M( d1 j5 S- y, i
{
8 ~* z' ^) H0 A
0 w4 ~3 M9 O9 j }0 `( @8 Q0 a6 ?7 D' r
*/
+ X# A. g) J+ _# L, }; W //comment out all methods, N=100000 202s " C0 n" T. H- ~( Z1 E8 R
}- ^3 q" U) n2 ]" e' h. u
8 x0 z/ z9 @6 c! Q; n; D0 m: J, X delete []b1;
" h6 b/ d, F) h5 w! | delete []b2;
& [$ ~5 m+ f. m* t7 u- ]* k$ L) p* O |
|