TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / M3 s1 @1 F7 l1 Q T4 t% D( d
* d; f% G) S: I2 V! X$ r理了理思路,重新做了一个测试。
! k4 A% O7 _ K* `! Y$ r1 [做了两个 vector 和 两个 float *, 都长 1000007 ?- J$ n8 B/ L& t j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache. f* H4 s$ f9 L; U+ g4 q
( @ J8 C7 D n* H! J n
内循环试了4种方法,3 n' g+ f5 K# g& e7 L
1. 直接调用 vector inner_product 247s 3 M# y* Q* _- d" p6 \) {7 o
2. vector 循环点乘累加 237s# u* b' I6 ^3 f5 k( t/ e' M0 E J
3. float * 循环点乘累加 204s4 Y$ W% X* a0 B5 v7 H
4. 空循环 100000 次 202s
* ^8 r+ w! q: z7 q0 C* P+ _
2 f( B. L; H4 Z! S不做内循环 200s& _: c! I+ n% G3 h) i$ b, [
6 {. G- R0 T# L; C你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ |3 e3 h( L* h# D2 k1 Y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 v/ x8 E4 Y$ t6 J) Y1 M3 h4 G, L7 O+ ?, Y
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& H* J( T+ q& ~( h8 {
# e" a# {+ h1 t" o6 K8 E
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
3 _( o) |4 K1 w' L3 Z3 ?1 I, f/ V+ K3 l M8 L B# n( {' @ R7 H
std::vector < float > vec1(N);
* ~: Y! |7 F- a std::vector < float > vec2(N); y: H! m# j0 C# {3 }
float* b1 = new float[N];
4 U8 M, n K% `; ]% Y# `. M float* b2 = new float[N];
/ p" ?4 t/ D% }4 g' V# o; _6 r( q6 \% F8 i
for (int j = 0; j < 6000; j++); v$ G9 V4 {2 Z5 E0 o7 C" i/ Q
{! n: c' b1 P$ I% x6 C& H
std::generate(vec1.begin(), vec1.end(), []() {8 w% X, c& T4 y' ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, @% g8 @+ _/ h2 t });
/ G3 z% S9 b A+ f4 u8 z, S' Z
% [$ H0 K% S$ h8 U std::generate(vec2.begin(), vec2.end(), []() {
$ n, K' c8 [ v" q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; Y A8 A9 }$ z6 s5 {! t });; x" P1 Z4 r/ k4 y& j
L9 s) ~5 T5 _3 N
for (size_t jj = 0; jj < vec1.size(); jj++), X" V( j4 z, w
{
% h4 R( w+ ?& W, \5 s6 \ b1[jj] = vec1[jj];+ ?& i* Y# d1 U" n6 }
}* m4 z* a: b! y @5 J9 W
% g5 d: ?1 [0 R3 M! Z
for (size_t jj = 0; jj < vec2.size(); jj++)
$ X5 f- ^& r0 \% i* T1 i! q {
* r/ _6 E, o9 c6 j+ w b2[jj] = vec2[jj];4 h( C( J# r: b% `$ S% k' j# ^
}$ x0 |. {! d' F; e' h9 l8 r) n6 Z# Z
5 X/ ~2 J5 u6 c3 [
//Method - 1 N=100000 247s / Q) c( e% |1 D( I$ J
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
# q- S9 i3 A/ a" k 3 Q# Z' ]8 @! v3 e, M" n6 |8 C& c
//Method - 2 N=100000 237s
j% _* B! x1 r /*
3 J& C% Q/ }1 K: y5 e1 h for (int jj = 0; jj < N ; jj++)3 o4 O3 N6 R/ ^
{& r+ z" B- A, @6 z) W7 T/ L! i
fresult += vec1[jj] * vec2[jj];
* M% s6 i/ }8 `& G$ F- s }
) H+ d+ t7 }. f9 P */
$ L9 v2 L6 i9 J9 w9 t
( m3 J% N, [ V //Method - 3 N=100000 204s$ N _4 R+ z+ s( s
/*
# Z6 A8 g+ m; ] T- s$ Z for (int jj = 0; jj < N; jj++)
0 T; u; [ v m* }- y {
2 l. c, S8 I; S7 U5 c* q/ } fresult += b1[jj] * b2[jj];' E9 Z" f* B" M+ z9 t, z
}/ b; ~' A5 J6 d& K% g H
*/
2 j' D2 G/ w0 D& F' e
' l! ~" O f7 s, ^ //Method - 4 202s
2 @1 m3 J6 z! o7 h' j% S& ?7 h /*
$ e% z( B0 \% h u, Y. |+ ~ for (int jj = 0; jj < N; jj++)4 O, S8 ~4 Q- d: @7 q! b c
{3 m4 Z6 r1 u% c" E3 f
2 x/ X5 P& z$ ?1 A& a# Q }+ w6 ~! Z; d! |
*/) o2 v: `5 u5 r- n! E- \7 c1 T
//comment out all methods, N=100000 202s
, {( s3 L! u4 p* l( W }5 F1 O/ e4 B, K& f* t: N
' {, b" W" f& _9 y. N8 o% { delete []b1;' O! K. {* e* n) u3 N/ L. ^
delete []b2; 1 N: y9 H W! N: x6 Z
|
|