TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 k+ G: U) l' p
$ e4 b( [& C f4 D6 ^理了理思路,重新做了一个测试。
9 j* A) }* Z* q做了两个 vector 和 两个 float *, 都长 100000 o7 z" d, T1 m) K* Q/ [
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& s6 } @6 [1 g# C( U: y
E/ G) ~6 ~& h% ^; n' O+ p$ b1 o内循环试了4种方法,
0 v7 i: b1 T( b( B1. 直接调用 vector inner_product 247s / ?0 W& g/ T' ?0 Y! Q
2. vector 循环点乘累加 237s
" m' \5 e; B. D0 }; h" Z3. float * 循环点乘累加 204s
9 a2 r& A+ ]$ x, D6 m3 ~4. 空循环 100000 次 202s
3 w2 E$ ?. O/ @* e8 b, X' V% E0 m0 }8 D1 X5 U8 d! [
不做内循环 200s( D# }- b' A e/ t( R1 H/ N6 O
8 d1 M! ^- t7 R$ m% |你昨天说的对,内循环本身占比是很小的,大头在其他处理。! y! J4 Y: A5 M9 L
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! N' x4 u( D+ B- J+ _
; J3 Q/ Y5 X% ~
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 E/ i2 k; q4 M+ c" A
8 Z3 l. S4 ?7 ?3 J9 B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 x' k. E3 \3 A- S8 s
5 o% [3 Y3 M8 B1 h
std::vector < float > vec1(N);+ I( C6 l w9 g7 `+ P' D
std::vector < float > vec2(N);5 u) O; ]7 H4 j+ [# i, {5 T
float* b1 = new float[N];
, D4 r' |7 e2 U2 i; f% Y9 b float* b2 = new float[N];& b ^! y- B3 Z1 l ?2 @8 S! ~5 F8 |
( j1 Z2 T/ J5 N& Q3 k. e8 \& { for (int j = 0; j < 6000; j++)
( I3 C& T W, c5 H [5 R {
3 q7 Y1 Z% P5 z a2 F1 r8 H std::generate(vec1.begin(), vec1.end(), []() {
/ B: o' l% A; G1 V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
5 E4 t" }3 J6 H: w$ u I });
. L4 p+ E4 P7 @3 M# t2 o8 N
& Y! e. m. b. K+ z x! j/ y std::generate(vec2.begin(), vec2.end(), []() {
: n7 G% @' U/ R& s& ] return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 b: }+ S2 A, H+ u8 {
});
" }7 n) }. S1 r
6 Z7 O8 |$ Z( {" n1 c, f0 f9 ^ for (size_t jj = 0; jj < vec1.size(); jj++)
: Y0 N' g9 M* t$ @ {3 J R3 n+ c0 |/ g; D5 N+ B7 ` Z
b1[jj] = vec1[jj];6 |( W1 O) v6 K2 y, ~2 c
}/ N! Y& ~, b5 r: e0 ~' o" N
v& f1 @: Z& n( _4 A, j' w for (size_t jj = 0; jj < vec2.size(); jj++)
* m6 P/ ^( o. ?/ [6 B {" l4 |) @: w' ^$ L& u$ S6 M1 _) `6 w
b2[jj] = vec2[jj];( ?0 s6 D( O: }! i1 ^1 ]. q$ x
}9 J9 M( s9 e- d% w0 {, [
4 b. i2 J3 F: [, j- b+ ~( R; g% u ^
//Method - 1 N=100000 247s
& T# D3 l" [& G2 x //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# J5 j+ b* c. p/ G9 x
- L t! L2 N0 D; f# A //Method - 2 N=100000 237s
( h3 Z1 _" Q$ x9 h. n; o /*& T; x* T$ ^1 i. f
for (int jj = 0; jj < N ; jj++)# x. o# y& T4 s, D: j6 ]( R+ L
{+ I5 o; q/ J+ [! q7 L n# J
fresult += vec1[jj] * vec2[jj];$ u1 T* U. N( X" e, Z5 W% {
}' P. f9 ~0 P: k S
*/
, f, n' ~( s/ ^5 D* n $ `" B0 z8 W' @1 v+ T" H2 v+ i
//Method - 3 N=100000 204s
4 V# k1 z) ?, X4 G /*+ H7 \! R4 `$ k; S7 ]0 l* n7 j1 S3 H
for (int jj = 0; jj < N; jj++)1 p+ L5 ^& x. E! \$ f) I( r! K
{
; Z# ~( q/ t3 [) J& t) i- x fresult += b1[jj] * b2[jj];
8 d4 [; Y* {3 C2 F! o }4 c2 z; D3 i+ c4 w9 q) t
*/& o( p: ?3 h! b- K6 s
7 H' f5 J4 t8 a n: d1 d //Method - 4 202s
( h2 Q. r2 @) N* m0 T j# {) T /*
& D2 [0 y1 y$ \ for (int jj = 0; jj < N; jj++)
. g7 y) Y( t1 ]6 Y; E! r: k6 H {# x c; f/ J- n6 A
- g0 f+ C4 A9 l; [& d# C
}/ w( E( x# M% u, F! l7 |+ m0 F. g
*/
% y9 n" ^7 {7 t4 _7 h: C3 v //comment out all methods, N=100000 202s 6 W, Z& {$ M6 q9 S* d
}7 ? o9 j @9 b
) b* }7 i! m0 }7 p8 r$ K delete []b1;
1 J6 E- k2 F6 D; I delete []b2; 4 C" C% ?1 U1 F% J
|
|