TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
% H+ r: ^8 @- q. q
9 I' F+ u8 P, s H理了理思路,重新做了一个测试。* w' y- X; N- I" H
做了两个 vector 和 两个 float *, 都长 100000$ t+ @9 ?9 P2 {5 E5 k% j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) l9 V! f B* K2 d. u# `/ K8 \/ ]8 \
, J/ j6 `9 G2 c9 ~$ \" Q内循环试了4种方法,- R' _0 p0 U5 T E+ o- [) ]
1. 直接调用 vector inner_product 247s + s1 h/ [7 L$ P' v9 D) h
2. vector 循环点乘累加 237s
% E8 w5 H! X, N( O: c3. float * 循环点乘累加 204s
2 ?/ C4 V6 I0 u" R4. 空循环 100000 次 202s( j9 p$ {* y, V5 a$ ]
' J, D/ _. Y: o a% t7 F不做内循环 200s
5 B4 [% t# Q8 A2 ~# j& p
$ F' O3 e- z) ], W: X J6 [你昨天说的对,内循环本身占比是很小的,大头在其他处理。' ^0 f) H' C3 i. s6 J; s3 [
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- i N, P5 @& W: }' J( G1 j
6 ~1 E C7 k) G6 b7 K1 ]
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) S# ?' {, D" b3 }
; b% z6 K, l6 \(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); t1 g- {0 }0 s( C9 I! z
) A* B X( o& V
std::vector < float > vec1(N);9 g8 R4 ~" b5 v K# ]
std::vector < float > vec2(N);
# \) ]$ J6 _# U X0 y float* b1 = new float[N];
" k( E @$ L" V float* b2 = new float[N];
# _ G1 S6 L4 |7 [. m+ s
; \$ B3 ^- Y3 J for (int j = 0; j < 6000; j++)) O" f/ W1 t6 Q' z
{, Y% O3 x& I" T# f; A4 N
std::generate(vec1.begin(), vec1.end(), []() {
5 t s5 S& V J d$ F6 k. b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ j4 Y) K( \! W1 I });/ G, d6 e$ j6 Z( D9 l* R
9 ?: \. H1 e$ X, C$ A9 W std::generate(vec2.begin(), vec2.end(), []() {0 s1 y* B8 }5 S, y: X4 Q/ s3 {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- I: ?. ^) _* N. L L7 _1 m9 T, @ });
1 \' o! B; x7 W! o; I: E/ V8 {4 ^- T4 ~9 S$ ?9 l% @
for (size_t jj = 0; jj < vec1.size(); jj++)
! S& P$ s0 D! }4 a {$ @7 u( \! }1 X1 a+ ^
b1[jj] = vec1[jj];! c. _8 g* v, ^: ~2 [5 g
}7 D1 e, L# a( M! Z9 t2 a) z+ X, L
) F* T" t3 \3 w for (size_t jj = 0; jj < vec2.size(); jj++)
1 K5 w+ X7 \! O( X8 t& E; C( | {& e) S% A5 g! t* i7 d
b2[jj] = vec2[jj];' c4 w; ]# r- i% a8 p
}
7 z( z F5 o6 k/ {9 K, o6 q1 M
( L$ O$ P7 G+ Z* K' y; N2 x" v //Method - 1 N=100000 247s
# r' f& I: g4 [, C! K6 d //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
5 K/ N* o' s2 ?6 ~1 |' H( J- N
8 |- u1 o, T/ W" _1 E //Method - 2 N=100000 237s# _% s9 z* E! s+ W$ ?
/*
6 T% T3 I; N- q+ ]5 p for (int jj = 0; jj < N ; jj++)
5 E: r2 P$ Q) ~0 u {$ p5 r T( P2 i0 S
fresult += vec1[jj] * vec2[jj];
. \) B O( m0 b! n) X }/ c1 L7 Y7 O) P' s& e0 u$ O
*/+ [" m0 e# Q" ?. u8 N5 K' O5 z, d. }5 }
q* G8 o5 h4 V/ o( b9 e O5 [
//Method - 3 N=100000 204s
* f4 k+ j" w( r" i. ] /*; o. o0 k6 D" i& w# Z8 E
for (int jj = 0; jj < N; jj++)
8 }! o# r, p$ J f2 Z {
3 m' P9 d0 b- M) k* u! ]* T fresult += b1[jj] * b2[jj];
2 @0 ^ ~7 E* M/ h, m! ~ }
2 n, O) J" ]9 M* |# u! @- y1 C */ a, S4 o4 S( q E; {
0 p: j' j! ^2 N3 y" p! u+ f //Method - 4 202s
l- x- [0 G' r( K H5 } /*
0 y' z5 n1 E) C# ]1 _+ ?! J8 z for (int jj = 0; jj < N; jj++) R/ s/ ]* g3 F! ]- ^0 s% q
{
# j/ N$ z6 w+ z/ C
# X" i3 W/ w8 `+ B }
$ ], c7 |/ H' }7 X+ U$ m9 H4 x( M9 K */$ n) C8 f. h6 A) X9 [5 ~
//comment out all methods, N=100000 202s
1 w+ T+ x, G }- ] }
* e! {* i+ U" f% y7 [ h
$ \! R1 K( g2 i' a8 Y delete []b1;, b |( ^! d$ q e2 @: ?/ m
delete []b2; 2 _$ ?- \$ T$ `: z. @: V
|
|