TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' X( f( Q7 ~( u- R; t
3 I0 |3 ^$ E& @3 O5 Z理了理思路,重新做了一个测试。, ?& L3 F# Q7 X- W: |8 T! m5 O
做了两个 vector 和 两个 float *, 都长 1000003 l5 u2 |1 L5 t% P# j4 g/ d
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., \6 @: h/ q" Q9 j$ r
" d( g1 S4 ^, ^ V
内循环试了4种方法,3 a( Q9 ^; R- d- a/ l
1. 直接调用 vector inner_product 247s ' o/ i" e! N, e- [2 N
2. vector 循环点乘累加 237s
, O# A4 b9 y! \$ @) s/ k3. float * 循环点乘累加 204s! E m& X8 ^3 ]1 a! y
4. 空循环 100000 次 202s
+ x! m) L3 G8 X5 T3 |$ E5 `9 c; t0 j/ B
不做内循环 200s0 T% R: @3 m$ m0 Y
; @* D8 D6 S9 N/ {8 z你昨天说的对,内循环本身占比是很小的,大头在其他处理。
) d# b) O: b; [* Y8 ^8 q( b另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 @1 h1 `* R3 \5 p* Z/ C+ D
9 l# P A% ^ t: o# A4 g7 W至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
: ^* u% e F4 y; I9 G6 ~) h# E' i* O; ^
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 a, D7 [0 f8 M0 t5 C( z' z
o& i6 B ^ K. E" v2 G5 o std::vector < float > vec1(N);
7 l, I h7 x6 B3 }6 ? std::vector < float > vec2(N);
^1 l9 }& N; N4 d5 O/ T float* b1 = new float[N];
0 y2 U8 E9 R" I0 p" A float* b2 = new float[N];; O# ^( J2 n3 j! v: m, j
) M9 w2 H: m* l2 x7 }5 N
for (int j = 0; j < 6000; j++)6 v$ Z0 g$ K( m" z5 `; I
{
1 L& ?0 R' N1 H7 O8 U( N% K9 } std::generate(vec1.begin(), vec1.end(), []() {" b* A" i6 ^1 C# W; d! M9 K/ C0 z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 A0 C5 i. [, _
});. T! ^4 B) h! r, B( V* K
6 q) r" T7 \6 j1 n8 y8 X/ V std::generate(vec2.begin(), vec2.end(), []() {5 e, H/ L# }0 z! W/ E
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) j. J1 O8 ]( M2 m/ b6 X0 @+ U
});: A5 T$ D3 T! i2 [" V+ p8 `
! J! h( A& x7 N; O! J" Y& o
for (size_t jj = 0; jj < vec1.size(); jj++)
6 a/ f/ _/ \- `6 Z' R {
# ]/ P) k3 X2 y7 j8 U b1[jj] = vec1[jj];: K1 V: Q& O4 z2 Y% N% A
}
. E/ Y4 A2 P' S2 e
% G M' u k5 E- D7 q; o6 B for (size_t jj = 0; jj < vec2.size(); jj++)* O, A% b5 k m
{. g4 l$ q6 R2 D. d( y0 R$ ]0 ~% w
b2[jj] = vec2[jj];
# q/ d5 E& q2 c8 c }
1 c$ d7 t2 d: \+ h/ e( X4 |, n- S, K& j. k0 a
//Method - 1 N=100000 247s
" h, U9 O& r0 b: O5 X& V# { //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 k, C# p' C4 _6 h* b3 T 2 U" O. p* K# N
//Method - 2 N=100000 237s# V8 F' n% i) |; n5 T2 J
/*5 ], h/ m5 v7 D
for (int jj = 0; jj < N ; jj++)1 h4 Y9 l) F. y! \! u# R
{
) Y7 [/ h' H1 N6 j% c, V6 i% ^ fresult += vec1[jj] * vec2[jj];
: |8 `' ^/ m& V. W( F( h6 r4 x) U }
9 Z+ k4 N Q$ k! M+ c4 j0 b& z */! L& u6 ~" x: U0 C& V. Z8 C
2 w( q; S5 T) z. ~( D7 l8 x" C
//Method - 3 N=100000 204s
2 R7 M W8 D" n& K3 ]; Z& T1 { /*+ l$ Q/ ^5 B) T) S" m) Z
for (int jj = 0; jj < N; jj++)5 _2 m. t3 L: \1 T4 H
{+ {7 l8 S1 {2 P4 g
fresult += b1[jj] * b2[jj];" Z! F' d8 D# q \$ w
} Q. q5 j" y! U
*/ N V( i# p0 q1 u3 f9 r0 i
' o3 b3 q& E {; u) n
//Method - 4 202s! s1 t& F" ]8 x0 [
/*
1 p2 T4 T' C0 p5 Z1 c for (int jj = 0; jj < N; jj++)
! Z p, H/ h& T) _! d {, `1 \+ r2 b, E( r1 h
, S# c* V* c% N; S }+ g! d; m) a2 A0 {
*/) v5 q" {: r9 J0 g2 t. t
//comment out all methods, N=100000 202s
. h K& G9 N. _! V }
8 _& i+ t5 N' E6 A; f# |3 T3 B6 s/ s" L, E+ @: u m U4 |
delete []b1;( H, H" G, u8 N1 o6 ?8 h5 ?( F/ `) z
delete []b2;
- W) H. q8 ~( t0 u- n |
|