TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) v3 f, A: A& ]% h$ L/ j0 P
9 g, M" a. a5 A理了理思路,重新做了一个测试。5 L2 [% ~" D+ Q r! G
做了两个 vector 和 两个 float *, 都长 1000007 ]5 Q# p0 T% |
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
V+ ~6 h8 P9 q) {' @. O
8 F Y( ~2 q' A ], ^# C# t内循环试了4种方法,- D: z7 B# y# }
1. 直接调用 vector inner_product 247s
5 Q% f- |, w* K+ S2. vector 循环点乘累加 237s0 a! W3 ^2 y1 m$ n U6 {/ F/ x
3. float * 循环点乘累加 204s2 H% V1 x, G" |8 g
4. 空循环 100000 次 202s
! t3 ?$ C; Q Y, b; }- ` w" p0 `( F n6 S9 C L
不做内循环 200s, [) }& x+ G' F, W
3 g d6 v/ J; j你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ X4 F* W$ t+ a- c- Y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
# e. j7 B( z; F+ Y
* g3 v6 Y6 ?) g+ F" e1 A8 U至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 D x0 L+ p3 w4 [+ [: m5 Q: e0 m
) S& g: e7 r* ~- o* @5 {
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)( o# t4 s: j) \5 C6 Z. L8 f( G( M
" T" u0 I( @0 Q2 |
std::vector < float > vec1(N);4 Z6 f' W% J7 i6 d1 c
std::vector < float > vec2(N);0 l* O: x. ]+ P1 `/ w+ |7 P
float* b1 = new float[N];' `7 ^, h2 H, S7 J( N |
float* b2 = new float[N];$ O1 l+ C! K" i# n4 E; V
- e$ l$ v: D* {5 T for (int j = 0; j < 6000; j++)* F5 G: M6 {5 Y2 v
{
( ?$ {* C, ? q3 D std::generate(vec1.begin(), vec1.end(), []() {& M9 A. f) c6 M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
3 `8 z5 \8 L" i });; H+ k1 T8 `+ J; J2 F2 v+ L1 b0 ?
' r X0 V2 P8 N" E$ j
std::generate(vec2.begin(), vec2.end(), []() {
+ P* m9 _3 Y( J3 i& z! q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 f4 j! E* C, @ });
5 ~0 l, G7 B4 _' r Z3 O2 z9 B
, A) i D' g8 K1 t for (size_t jj = 0; jj < vec1.size(); jj++)- M G& |& e6 F" ^, g: }
{
3 R) z4 H: O" ^. u9 m0 i# G! d b1[jj] = vec1[jj];$ j5 K3 `. d p f( y: T* V
}
6 W* @+ X& G* [+ [& k7 U5 ?4 r3 J
for (size_t jj = 0; jj < vec2.size(); jj++)( i t$ C4 y6 V
{
5 X7 } w6 q# ?6 X# t: Y b2[jj] = vec2[jj];
y* a/ Z2 i# c! e( S3 h) @ }
% e. `% b) i2 e9 H# ?: q% ^0 ^3 o+ ?; J, N! _! x# Y5 m+ d V
//Method - 1 N=100000 247s L% ~9 J9 s% L6 W4 Z( Z4 a( {& |
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
& V( T5 C4 q1 C9 f$ {( ~7 o4 S0 c- b
+ ?8 h' s) ]: L //Method - 2 N=100000 237s
# J1 _8 B& _8 ?, D$ f; G/ f B /*
2 A+ @8 e2 z) V1 O/ f6 u- d' I/ I for (int jj = 0; jj < N ; jj++). o0 i' F8 P* ?- P
{
& v5 I) V, Q% { T& l- y0 b$ l2 ^ fresult += vec1[jj] * vec2[jj];
3 C) }. ^4 l) V. m- e; W* N8 A }
! ?' V$ {0 l* W/ r3 T */9 c& F. J' Q" s
3 ?: z9 P! A8 j/ s) h0 |- j: m //Method - 3 N=100000 204s
. b; Q2 b- H: o; h2 { /*: P, l# a4 [, A' r
for (int jj = 0; jj < N; jj++)2 d1 z" p* _3 T
{0 G/ k! {- C5 Q4 O5 Z8 v0 m
fresult += b1[jj] * b2[jj];
+ [$ H1 ]% v: N) X ]% v }
. G$ h+ b. ^' _$ Z5 M */# f8 [0 [8 b' S: H- P
0 ~& @$ R; e* [+ O- y7 C) t
//Method - 4 202s
2 q7 Q# V4 K. k /*
+ y6 D( q* k5 P for (int jj = 0; jj < N; jj++)
9 Z+ G% d3 Q1 E" n+ {) A' J ~+ n c {0 B8 w7 M& t) n
& k% B8 Q' g8 m9 i7 e+ U ]% i
}
, I( f& q* f3 f% _3 Z7 ^ */
- y& l8 \1 g$ I8 m4 X; ~2 k //comment out all methods, N=100000 202s
9 q& @/ [; f5 }; B0 Q5 W }
4 E5 O$ l' r2 o6 Z2 f6 p0 q1 x! A z. O6 c
delete []b1; y0 W( ]4 X! r9 c9 |4 `! Z7 d
delete []b2;
~) d: P$ V' Y, T" [3 v- Z |
|