TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
& ?/ W6 _- p( i" M4 P
$ Z7 Z+ ]. @: e5 M理了理思路,重新做了一个测试。- J0 s- T7 J3 ^
做了两个 vector 和 两个 float *, 都长 100000* `% c6 e1 h2 F+ R3 r& F; b( t7 K
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 E3 L' H9 x7 M( m
3 g4 Z' D1 J' z! L, Q8 f9 _
内循环试了4种方法,
8 z7 F7 T+ Z3 R+ S/ i1 \! B z* Q1. 直接调用 vector inner_product 247s 3 z1 w2 [: v' O
2. vector 循环点乘累加 237s: Y# j1 N% F! w: X# }! ]5 B
3. float * 循环点乘累加 204s
- |1 m ?- F4 n4. 空循环 100000 次 202s& v) H5 [" y! h4 s% J* m
1 g* {+ e" Y8 x* B9 i
不做内循环 200s
2 L" j6 q6 T* s* O
, |, p% u! P9 ?2 m" D& F你昨天说的对,内循环本身占比是很小的,大头在其他处理。( a9 {2 a) S4 C/ V! w; a# a) I" ]8 _
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。' F/ H* L/ b5 f% d8 m, i) c$ z4 a3 O
, R: f- Y& Q2 K5 e# \至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 E& j* q D$ a; \! ]1 ]& R
0 `- @5 _5 e, D7 l# [9 B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
. I8 a/ L+ ~1 G: l+ ]4 b- W+ G" T$ n4 n% |9 r8 P
std::vector < float > vec1(N);
0 e* d' d, N' h/ O0 g3 ~ std::vector < float > vec2(N);* p5 I: Y. k. S+ m+ \) c, P' |
float* b1 = new float[N];
$ f0 _& |6 B9 P V2 d1 h: O float* b2 = new float[N];
. Q3 m1 {. e. w4 W$ \) D4 k: l0 K# P/ G" S
for (int j = 0; j < 6000; j++)
, f Z+ [; F5 R } {/ E7 _+ K7 W/ b: y5 I3 o
std::generate(vec1.begin(), vec1.end(), []() {
- W9 R; u) p- n, G! w$ B return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 Y4 w5 N [( t
});
9 F! F. K {& p N% I
. p3 O; v# W( A2 O! w0 Z std::generate(vec2.begin(), vec2.end(), []() {
$ V! ?" b6 O* q# H7 L. s return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
* Z; V' F% t0 W: p4 n });
+ q$ p, t, F7 e- D5 b, x K5 s) E" ~
for (size_t jj = 0; jj < vec1.size(); jj++)
2 |1 r* e8 \/ e" l! L9 { {
7 H6 {) P4 D# k) T- X b1[jj] = vec1[jj];
4 s0 R8 r( e2 J$ q! _# C& k }
% S0 L3 A% x m, t; f4 U: \6 `
3 `+ f3 c5 c7 @/ F% X5 ^- Y$ V0 X/ t% d for (size_t jj = 0; jj < vec2.size(); jj++)
- L3 i. _- o- t9 } {, ^" G/ z* V) M8 ~
b2[jj] = vec2[jj];
; _ C# g2 p' [8 w7 R6 c9 c }
/ \$ {1 U; `' v% K4 O& P4 |
7 F8 P$ r0 _4 ~ //Method - 1 N=100000 247s
8 f( L1 u- N5 l8 w$ r* v/ Q6 h //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, h' o+ j4 q2 j3 E( {/ s $ H. J7 H w& P# q
//Method - 2 N=100000 237s3 X: {, j; g( R. l; P
/*7 T2 j. z. I' R! q: c# S
for (int jj = 0; jj < N ; jj++), q& F: P' Y% B3 I/ Z; ^
{/ p6 d# u1 x( G$ m4 [
fresult += vec1[jj] * vec2[jj];/ X/ I# k! @% g7 h( }' V, q0 `
}0 M/ M) z. w2 j) Z8 y
*/
: V( a/ v+ w. ?" }8 S
: B! P J- J2 y {5 ~9 X5 { //Method - 3 N=100000 204s
. f6 R, w6 @6 T P$ F /*
. c7 X' D, T, `; r for (int jj = 0; jj < N; jj++)
# O; Z$ Y# B' n- e) C( R- D$ q/ J {4 R3 H1 K& ]$ p
fresult += b1[jj] * b2[jj];8 Y+ X4 t, _5 } C% J; r. D! m+ @
}' _4 q" ]3 ]8 F6 [9 y
*/
- p @1 }7 J0 w- E
# n; u0 M3 V6 g7 F+ | //Method - 4 202s% D) b$ g" x' G$ T1 C. o
/*
/ O* a* @3 e. l7 e for (int jj = 0; jj < N; jj++)$ g9 }: q: N3 I6 [
{
2 w* J m/ g6 Y. W' Y 4 z: s- _, b1 s2 c
}1 ~. S: a" P9 ?7 J. S4 ]( [
*/
5 o/ C C, o; E/ T //comment out all methods, N=100000 202s
* v, }6 h0 z2 D$ k }
4 W" d3 S; D6 N0 ]. f
0 m7 m$ q, n+ X6 f L delete []b1;
( P3 [: ^' O* u9 ^. N0 P) v delete []b2;
$ C- y2 r; Y& S1 p |
|