TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 a9 k5 J, |% |1 r! J* U5 x
& G5 a4 \: J4 i( P* W理了理思路,重新做了一个测试。
1 l" W% E2 n3 o% U2 o! g6 @做了两个 vector 和 两个 float *, 都长 100000
0 f3 U. C& n9 J5 k# k* M' ?, b外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 ?& _" w3 R2 Z' W" c
: ~1 A+ G8 s" h% j4 e ~9 A- `! S
内循环试了4种方法,# C; O; G0 w% q% _2 l1 y
1. 直接调用 vector inner_product 247s
5 J2 x* t- |& ?% s" P, o( o2. vector 循环点乘累加 237s$ d5 M& N: [# k. P
3. float * 循环点乘累加 204s
+ n% ^% o* m# X2 r4. 空循环 100000 次 202s. d( G( H! m) K! W- [+ X- F* Y
; }: Y4 Z" x7 F" u* _0 {
不做内循环 200s
l) o" y& ~' B
# e( ^3 n) @" o3 r8 o, m% i" E( D+ ~& a你昨天说的对,内循环本身占比是很小的,大头在其他处理。- p7 @8 ] \7 _ f( ^
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
1 E% u6 b3 L$ V) _+ E f a K: Q- f9 {9 O! c
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
w9 h' a, ^# b8 z; ^ L" E* Y. h( @ @$ n+ q8 @( p7 l0 ~
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) \6 z6 F; G- n9 f8 c9 T0 Q" T
0 C v$ E" x4 u) K7 K std::vector < float > vec1(N);9 O: Q7 b, \: Z9 C
std::vector < float > vec2(N);5 D/ K6 \6 F* D. R; M
float* b1 = new float[N];( N( @& b& k8 Z# ]
float* b2 = new float[N];& e+ V/ ~- i- u3 @2 @
* M4 f% ?$ m; h4 T/ k* h$ d1 {
for (int j = 0; j < 6000; j++)
; P( G2 z9 {% c) B3 U& \% `2 L* _ {
6 \ a( `0 k) v# X* } std::generate(vec1.begin(), vec1.end(), []() {2 m; g- z, f( S+ [/ z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' o0 U% e" Q3 ~' @; o });
) `7 d7 I% e7 f' C# R& r
7 l/ P1 \8 w7 u5 h6 Z* g8 O0 F. C std::generate(vec2.begin(), vec2.end(), []() {
" F/ V: Y" h$ o3 X1 n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
$ T7 r& D5 b+ p% t. ^ });
0 g6 R! T$ H/ r. L; e* {' h; l
& }: V6 ?9 [. V; w" ` for (size_t jj = 0; jj < vec1.size(); jj++)5 I! }+ n! l1 z1 B& R: C3 S+ f
{7 C( P/ p1 n, M- ~' u% M
b1[jj] = vec1[jj];
9 m0 U* D0 D- B) w) g$ Z1 t }
~8 X5 C' I$ C5 v9 }2 {' j6 n. u3 U* ~4 q$ q6 t; N
for (size_t jj = 0; jj < vec2.size(); jj++)! S, Y& M5 E7 i$ ~2 U
{3 R; W4 ]$ ?/ K4 P# U
b2[jj] = vec2[jj];
. Y, \; o# K( \/ I. C! R c! H }$ D) w- @1 J$ w9 l0 E$ _- ?$ j. y
) l4 v1 _' p/ e5 n9 S //Method - 1 N=100000 247s
, @# O, B6 Y# A! H8 n //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; d4 m0 N+ ?1 K4 O5 G5 }
4 n$ `% ~+ u) }2 f
//Method - 2 N=100000 237s
# u6 g; S1 l P7 v/ f$ } /*
2 j7 U V7 T5 V7 L6 H for (int jj = 0; jj < N ; jj++)- G" W# o" ]% ~/ J
{
! S% [6 a2 E# T* T5 b8 @' \7 v& R fresult += vec1[jj] * vec2[jj];. A" ~" W2 o/ S) v u; R
}- O4 W3 \+ q5 ] W9 g/ h/ B
*/; q* O F9 |5 O0 S, P$ U1 y! [
/ j+ E% R& W, f2 f$ S& ^1 O //Method - 3 N=100000 204s0 K( N& h9 b, z0 l- w
/*9 L; w+ ]2 z& V5 W* ]# v) ?2 F
for (int jj = 0; jj < N; jj++)" Y; d7 f4 g2 v( R D4 L
{
4 k, }" \- `- q, x. a, d fresult += b1[jj] * b2[jj];
8 K" y. _2 z) \% l1 B. e4 H }9 S6 B' y+ r2 p D/ p$ e0 J
*/
. C' s7 T1 o8 Z% Q! y; I
% k' T0 |5 V7 T. d* j6 i //Method - 4 202s
- L2 e5 p0 X4 v /*
/ v, J0 z3 j6 f9 `) o; v for (int jj = 0; jj < N; jj++)
! C' u+ U' k; ^3 H {
2 c$ }/ A$ l& F" q, x$ B 8 x9 ~, m& ]" _3 B4 Y. G5 Q u
}
! J! `4 C! Z" M2 C3 p9 x( J( C */
2 C6 A2 N D# m //comment out all methods, N=100000 202s
7 {* k, F: |9 ? }3 d( E1 U' s6 v! s
% K. y6 k/ ?/ X" h( S# w7 u+ o8 T
delete []b1;
0 g" c+ T9 H# A* b delete []b2;
0 k+ K! `, u( L: j; z, [ |
|