TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 Y. W" i( \/ ~5 O
2 p1 \0 d" n3 ~% r/ H
理了理思路,重新做了一个测试。
. O- ^ Y9 L4 G) z& M+ E; O. s做了两个 vector 和 两个 float *, 都长 100000
N/ w5 J7 ?1 A$ m0 R外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 N( `& [5 p1 B2 A m* l4 l3 k
; w; _# W/ f) ^内循环试了4种方法,) v6 E9 Q) o1 _! D5 y1 o- y$ C; G
1. 直接调用 vector inner_product 247s
2 \: h" w+ V' }2. vector 循环点乘累加 237s3 O1 w) { I3 S5 ^; _& K9 j
3. float * 循环点乘累加 204s
& G0 \- P) i8 |: O4. 空循环 100000 次 202s( j9 B# p' n; t. M1 G+ ~8 F
+ ]+ j8 T- m1 K8 d! i o2 t
不做内循环 200s! F7 P; ^" W& a
! \9 B# P6 E- f* \% C% k1 @你昨天说的对,内循环本身占比是很小的,大头在其他处理。; {; J; u4 P! K. Y4 x
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
: t! d3 U% e& t6 t
( B) J) V# P7 K% o# F至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, Z, ~ k u4 A- d
* q1 w5 y0 c( ?/ s(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 c& h6 h7 J' _; D5 `
( T% M- l; O& G- w+ } std::vector < float > vec1(N);
" g& a# m) o4 |- d3 e std::vector < float > vec2(N);
/ d4 h2 E2 Q6 W# N7 N! s9 K float* b1 = new float[N];0 K( J" n: J i" f
float* b2 = new float[N];; ^2 i' L7 ?* N2 j. V! R
+ \9 b" v4 f, a+ V$ G, C+ I for (int j = 0; j < 6000; j++)
' F5 U2 Y4 P8 S, X" ^. Z9 t1 b {
. M! o5 ?+ I9 K6 q# z std::generate(vec1.begin(), vec1.end(), []() {
# P% J9 S* n+ ^$ G3 H( K" p0 T8 ? return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 {$ v2 C2 T. S g% K8 n
});: X1 g' }: s; x- Y& I
9 ]1 h0 s0 m9 b- _5 J8 @" o3 W, J std::generate(vec2.begin(), vec2.end(), []() {- j% ^1 b6 L. d% R+ o) [; Q1 ^4 @
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 n) F7 n2 S E- X$ h. E
});6 }: p( m d; p3 K; ?. S9 L: G
/ L3 l" F* S# \% [
for (size_t jj = 0; jj < vec1.size(); jj++)" u4 n: p# e5 F$ S
{
: w" f p. E3 B' A b1[jj] = vec1[jj];
5 B' G/ I1 g5 v2 ]+ ~9 t. K! ^4 a }( I5 o8 H. A8 x- B3 ?0 S
6 |' O" ~) P) u for (size_t jj = 0; jj < vec2.size(); jj++)' z/ ^! o9 ^+ }9 [3 z
{& H# P; j P# D% ^) a j4 U
b2[jj] = vec2[jj];+ D, g+ ?) S9 j* [. X4 t
}+ ?5 t1 B; w$ a1 s5 }
7 T! j( a: A8 o. V y //Method - 1 N=100000 247s
" k, q3 k4 j' z3 e //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
5 Y4 \; [) }; Z( o/ L7 F & l" Z9 J% i( _! c3 p7 U
//Method - 2 N=100000 237s/ B* t o+ m# m
/*
8 I9 O/ I/ O/ k5 U: r9 P for (int jj = 0; jj < N ; jj++)
8 N; s4 _( G3 r9 c0 i5 n. I% k' } {
. o# _0 w4 H$ l fresult += vec1[jj] * vec2[jj];
, z: S/ y, M( W4 J$ f) E }) ]; _ m4 J$ O' l: e4 M1 Z
*/
4 Z8 g- G: n' {* w8 S) _) @' L% k4 Y# ` # n4 m z9 ~8 H& ]+ I
//Method - 3 N=100000 204s
; @8 L: h v( ?2 }5 P /*
; ~: Q2 q3 c7 Y4 l0 n for (int jj = 0; jj < N; jj++)+ q- Y7 `: `9 M$ O
{
) _9 F4 C* q3 A3 c fresult += b1[jj] * b2[jj];
% ], l% [( Q: H" T) t9 F }% M+ S. X4 p4 `7 G, S
*/
4 J% H) U8 E+ b- \. v! B e: U
. K4 a: J9 Q6 o1 h" B( j* A //Method - 4 202s' N( ]' t3 h/ C% g
/*0 d2 X/ k- e, g$ f5 D* O
for (int jj = 0; jj < N; jj++)
$ g* r0 Z# U/ {: t. J0 E+ @! H6 f {1 W& d, w2 L& D# e) ?
4 q+ t! d6 M" P9 `3 v* R }
7 A9 c3 F( C9 q" l% `& K */9 h7 ^. B8 ^5 ?$ S% w7 i3 p
//comment out all methods, N=100000 202s : x, Z3 M, l1 `4 _5 ^7 N F q: M
}/ x# ^; g: C% m3 q8 g
% U2 A2 A5 i9 M T delete []b1;
9 Q) l: I+ o/ q delete []b2; ! ^( z9 M: n1 c+ u6 ^
|
|