TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
5 g9 ~; f5 t, v3 D6 w3 V, S. `( Z8 O. v7 p& T
理了理思路,重新做了一个测试。6 }% B) W6 \' O; \9 y$ D
做了两个 vector 和 两个 float *, 都长 100000
' i& D# ]+ ~8 E D; X3 j# G, d4 I" a外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
/ z" ^6 q" h, C* O3 E( F9 l( h3 m& R( d! p
内循环试了4种方法,- h* D/ ]# y* p4 y6 t
1. 直接调用 vector inner_product 247s 8 n3 U1 ^( r( u/ O T1 K
2. vector 循环点乘累加 237s
1 h& U1 v1 n! u) N3. float * 循环点乘累加 204s/ O! W/ w( m3 B* y3 i
4. 空循环 100000 次 202s
e$ M8 Y* L1 E8 s: L5 h5 z3 J. H! y1 C: t5 c# f
不做内循环 200s
: \$ H- H0 A6 K4 F( C4 o
% K: ]. G: I& A8 r8 c你昨天说的对,内循环本身占比是很小的,大头在其他处理。( v. Z2 d6 [; H& S, O* S) E
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* y9 \! ]+ l2 s; L7 N! h' k( n
- X0 p, d# j5 r' U1 ]
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* U* c9 Y6 r0 I5 A. U+ `; p
" m7 \0 _+ o2 g(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 L3 \$ v& ?' A- B* F4 a4 n6 r5 W$ q# F
std::vector < float > vec1(N);2 Z4 h1 r3 G' z
std::vector < float > vec2(N);
' H0 f9 I! m7 F9 r- b; V float* b1 = new float[N];' p; {( j4 A& h, r
float* b2 = new float[N];1 s! \# `# C- G6 A8 _4 D
7 p9 I' ] o' A7 ^ R$ M# D for (int j = 0; j < 6000; j++)
# k5 u2 ?8 D6 v, E {9 V& T; d! @5 N! h/ y) W7 [; r/ i
std::generate(vec1.begin(), vec1.end(), []() {
c: x. u7 o1 M5 P9 j6 ~ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
1 z |: s( ^8 {% O. m$ e });
' u+ a0 \' z! E$ J2 L5 L O, Z* O$ j# Q, S. K8 q3 E2 x; r* A+ C
std::generate(vec2.begin(), vec2.end(), []() {7 k, _9 F D- u9 p6 d9 L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
* c6 r+ Z' ^& k. O4 a: `$ W });. D) H8 D! j5 ], o
' B+ q! S$ I! y/ H! Z. d for (size_t jj = 0; jj < vec1.size(); jj++)
/ W7 G* J8 h% z8 d2 ]' C y( [ {6 H0 r& a. M% S0 t9 m, C/ g) K
b1[jj] = vec1[jj];5 Q/ i* y: w$ j* H4 f7 K L
}
6 k. H( s* t/ B6 L& H( }
% X$ Q' T3 ?5 X$ v! S9 t for (size_t jj = 0; jj < vec2.size(); jj++)
* d" p S3 f0 M' w( L1 ~ {" w3 ?" ~) ^# l. L# c# n
b2[jj] = vec2[jj];' c" h3 m& ^6 u3 ]
}! S, G& u; U2 z; l; k
/ a+ O* S, R# Z6 W9 Y //Method - 1 N=100000 247s
, Q; I6 f& ^3 x6 `; y$ P //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
6 U* _9 ^5 B6 {8 i" L * f( I' v: }4 {$ U1 ~: ?2 }
//Method - 2 N=100000 237s7 Q: h0 n( A/ H' z/ p4 ^; D
/*
3 l5 t: I0 G3 N }% q: ` for (int jj = 0; jj < N ; jj++); `% S3 S1 O: r6 q+ h
{
' h3 e |' p4 r4 [* E fresult += vec1[jj] * vec2[jj];
/ g5 B, G; f) _- O" W }
2 j _' m. g2 I. e0 H5 v% b1 B */5 E- T1 X! {6 x \- e- s
; ]9 b. H" L5 N9 [* C
//Method - 3 N=100000 204s0 e" u. [0 r4 S; ^
/*9 R5 \3 G/ J6 y, t
for (int jj = 0; jj < N; jj++)
5 I* t9 `8 }# ` {+ _, ~# z9 z, Y: i2 {# I
fresult += b1[jj] * b2[jj];
0 ~ H. x' I2 b8 A; P }. B, q+ I$ a, J% V+ R3 o! U8 c
*/
! k. V9 m- Q. q3 D
) s9 w% G# z& Z* E2 y& ] //Method - 4 202s! C9 n2 S2 ^& C- t* V; i# \
/*
' H( H" D0 _, C ] for (int jj = 0; jj < N; jj++)
+ _5 ~$ Y: U) x {
$ n1 n+ r) L4 F+ _" p) D: H
% [8 E2 U- R7 |) K( w8 W }
1 O Q+ E8 ^' J. @6 Y; s */1 u) E9 p- p! O! J' }
//comment out all methods, N=100000 202s
; P1 S) [9 [9 e6 T4 N: y }
2 U& I( l; q' O4 C6 R
& Q: E! c: b7 p$ i4 O5 n0 o3 f8 t delete []b1;) ~. {3 B2 f# L9 _# z2 K
delete []b2; 3 N5 s6 g8 D/ l1 I5 J; n
|
|