TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 w& a, J6 w& ^) i+ r# M3 d
; E7 K% n* \( V9 \理了理思路,重新做了一个测试。
4 c% ~/ o. ~: z% M) D8 N3 A7 L做了两个 vector 和 两个 float *, 都长 1000006 m4 n' v! i' D* R
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ R1 g" L" u& N W; e* V& y+ V2 [) \" A
内循环试了4种方法,
* }2 P6 x( A8 V: f1. 直接调用 vector inner_product 247s
0 ]6 S, J( E* T! r2. vector 循环点乘累加 237s. V+ X5 V6 ~9 u
3. float * 循环点乘累加 204s+ p" g* y) v" V4 x7 ^) j( d& p, \
4. 空循环 100000 次 202s* c' W4 ~4 G% N a6 P
* ]" b" e- c9 Y) e1 U/ g( H不做内循环 200s; u4 \2 j, `2 n7 e& G6 Z0 \
! B G7 K- k0 R1 T0 i# }
你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ i% G2 ~3 |: Z5 j3 U$ g
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 h0 i, t1 B! D& _ h/ n
; }5 x3 F9 F: j: V' p至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). t" G! N( B- }9 \- D
/ b" R. G% ]& U9 G7 ?4 d0 S3 p
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 i$ y' H" P/ P3 O: C- K0 V9 g; Z. U5 ?1 w* A3 w2 P0 |+ p( y0 b
std::vector < float > vec1(N);
& F1 u. e1 a& n. ]9 [1 U* k6 y9 h" y std::vector < float > vec2(N);: e# w+ J" v6 J7 a
float* b1 = new float[N];
: C4 p% k0 |$ W; t/ Q float* b2 = new float[N];
$ T- M0 E0 ^5 `0 G4 O# K2 \' p# T% C5 U
for (int j = 0; j < 6000; j++)
$ o* x0 S" V) W2 Y+ |. ` {
/ f# L! ^! `! o std::generate(vec1.begin(), vec1.end(), []() {
$ i+ Q4 @2 x& Z( u0 b. h0 `3 M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' F& r2 z" [* [" S& R* C3 f });
) [( i1 U3 B% H$ {: k" G
Q" k! e. g; }6 M* f std::generate(vec2.begin(), vec2.end(), []() {
$ q, ~- d- r1 X5 f4 h return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 L, i4 X1 t1 M8 a+ J Z });& Z: S& b3 f+ ^4 M% z# l
9 u- p2 I# Y5 J& ^' `0 ~ for (size_t jj = 0; jj < vec1.size(); jj++)1 L w! v+ P0 J) }* E
{# s i/ E) `9 D% D1 r1 f+ c! H
b1[jj] = vec1[jj];
4 v1 g l. m; p7 k: X7 s }# O! d( c) @" _5 n# c
# p4 J8 g7 o a2 V/ e9 o for (size_t jj = 0; jj < vec2.size(); jj++)' W% h/ j3 x+ K7 p2 C9 \/ _0 U" _
{; l) V9 w( A5 I# _) H
b2[jj] = vec2[jj];* U6 \7 [/ d$ o/ v
}
* M& C; @6 _6 V6 `; _( J0 T2 V. R1 F
; z) Y% [1 D, E( E+ L+ q; ?$ ?% z2 X //Method - 1 N=100000 247s
' N( ~& d1 P8 t5 b //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 D+ c8 ?5 z/ S4 N M
8 d; E% T& ^, ` t' d% }0 }- K0 Z7 n* T
//Method - 2 N=100000 237s/ m- I4 }7 W; |4 T- B, n7 |2 I
/*
' r% u5 `: k2 Y, {8 L7 `, ~5 I for (int jj = 0; jj < N ; jj++)
( O: G# p* N6 w5 Z+ ` {% M( h& c w& n) c2 x" B
fresult += vec1[jj] * vec2[jj];
/ s; ~3 O5 X- f9 H6 w6 j }
: a7 ]. J2 ^6 i* n */+ O) |4 {! h5 M
5 d N% ~" e8 v: L5 B! G& g0 I
//Method - 3 N=100000 204s
5 J7 J4 `: Q5 T! |3 ? Q /*
" d4 d/ ~$ z, Z3 f, \) O for (int jj = 0; jj < N; jj++); D- D8 B- h7 v! X' I# i. m0 I* |
{* q) a- L0 B- z9 V- n# V1 B
fresult += b1[jj] * b2[jj];+ w) f8 f6 J% Q$ {7 f
}
5 m; G) X2 P7 `, ?1 ^/ [ */: {5 B, j3 W4 b0 y3 k9 f
5 {- U, i# g v
//Method - 4 202s
/ J; |0 i R6 o' C2 e /*
, L( P" m* [ M& @( O for (int jj = 0; jj < N; jj++)+ z! z2 E4 L' z
{
3 P/ P% b, l0 m- o + J8 M' v) ?2 n4 H4 i9 t
}
0 i" V: E4 a. @ */+ d, A. n1 H& g' |9 @
//comment out all methods, N=100000 202s
5 V( A5 J; y' Y }8 _6 |7 N( z0 B
7 ?2 e/ K, k& ?
delete []b1;1 T% w5 _# u+ N r+ n( A
delete []b2;
! d( q8 r, q7 I1 Q8 e5 K7 @: C |
|