TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / q* P( ` s0 [3 O
- z9 q+ I0 p A; [7 U
理了理思路,重新做了一个测试。% t7 z- R* ]0 j
做了两个 vector 和 两个 float *, 都长 1000000 j3 N# I' e$ p8 F0 ~
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ M O3 p4 `9 C) o8 ~+ s$ h8 G @
; d6 |2 N7 p7 n内循环试了4种方法,
: \# B5 ?6 W9 r4 R# o0 V1. 直接调用 vector inner_product 247s ; a0 W) M" V- }' ^6 X, u
2. vector 循环点乘累加 237s; v, k7 t" G( c' z8 e1 k, r
3. float * 循环点乘累加 204s8 c6 d. D/ {0 [: H$ I: p
4. 空循环 100000 次 202s$ j. Z4 B% M! m6 [
* u3 i3 x# t8 J) k2 O
不做内循环 200s
* M. S* b r8 ^1 e% l" D% d2 K6 o: {1 [0 v$ T6 N
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! R+ ~. d' V; M$ O! H* L; g另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 b0 J7 X) m" f/ S0 A6 c
: {4 K$ k9 g2 H
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
2 k& ]" w* z1 G z( G+ P4 u9 l
# q, i0 r. R1 G" k(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
& n; t# D' P- ?! Y: H
, s [ v4 x, l, j! ]+ }: _3 b N5 C std::vector < float > vec1(N);! s% I6 \4 ?( ]! P
std::vector < float > vec2(N);
% O' a. L/ N2 Z4 U float* b1 = new float[N];
0 ?$ Y3 E1 t, f Y/ Q float* b2 = new float[N];
1 Y( |5 t) K/ Q3 c! v U- U E e: m5 u0 c8 G: v
for (int j = 0; j < 6000; j++)3 v7 t4 x( b, ~, d$ }
{
v8 x: I* P' k+ h# n std::generate(vec1.begin(), vec1.end(), []() {
* _! A0 Z( v: U6 s7 }$ Y$ ]% r$ w return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" j9 M; a% `! j2 C8 J7 P6 Y });
) o6 J' H# z2 |* m. U# _! f5 ]; \
* y6 g. x( _. s- l8 e std::generate(vec2.begin(), vec2.end(), []() {! ~% e1 u- O- C) @, H f# B
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 C4 q3 W3 C! N }); y( r3 k+ z% @. X. d
2 n5 w/ C- I% q for (size_t jj = 0; jj < vec1.size(); jj++)5 L- }% A6 _4 ]! H+ K- S' N- P# |% _
{% s) W1 |4 H ^9 d
b1[jj] = vec1[jj];
$ h6 ~# M7 M6 [3 O8 A }
# O( u4 b+ P w
6 W" D0 {; E' C; v/ b for (size_t jj = 0; jj < vec2.size(); jj++)
0 g2 y& @2 l W+ R {8 u7 @# [# J9 K
b2[jj] = vec2[jj];
* b8 b& [# q! ?8 ^. r }7 f; W& R' J* w9 O. o
5 r# V ^1 A7 {1 z v9 ]
//Method - 1 N=100000 247s
+ {: A! Q+ f2 Z; `. p, V //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. R8 M- {4 ~, l4 \7 b4 {
3 m5 @* C" X! Z, q1 F7 D //Method - 2 N=100000 237s: P1 T5 v7 x" c) W2 g2 V
/*/ y7 W- f! H( w* ?: V! f, f
for (int jj = 0; jj < N ; jj++)
9 B* y6 ^; S1 B7 }* B {
$ |1 F' p- x: n2 R& J, v9 I fresult += vec1[jj] * vec2[jj];
$ m6 C7 k( Q3 M1 ~ }
3 g, e, |+ a, [" G */ a# a/ i8 R# u3 d2 v5 M* U5 A5 I* x
- T" E3 M% N4 M( M5 x //Method - 3 N=100000 204s
! q1 [( q! A4 z8 U8 | /*& r/ |. N& W# ^) k9 \
for (int jj = 0; jj < N; jj++)3 F' ^! q, q/ j; E3 w5 w/ h% Y. f
{& y3 m; R. Q I+ {
fresult += b1[jj] * b2[jj];+ z% J1 ~0 V3 I( T1 o: O
}
9 P: L, n. W% x& Q- C+ w */: u8 v- D+ V: v6 [* d( J/ I
2 j1 e5 s |0 l$ ? //Method - 4 202s
% r" l" o8 x& q, q0 c /*
4 W5 S: g8 a# P1 O for (int jj = 0; jj < N; jj++)
$ |8 _ _/ m/ n7 X7 N {
+ c$ S1 A; }6 Y2 i/ L; u& @6 j
- ^ I4 m/ f6 s! K$ s3 l7 } }
& K6 o% E: y( c */
3 g# X& o$ T" H2 D% A1 ^/ V& ]/ U' u //comment out all methods, N=100000 202s
1 u" D+ i& i1 k- _; E7 _5 m }; S( \8 m% F# ~
: s4 M5 E4 L7 G1 b! x- l
delete []b1;
3 C0 J- b1 @9 j( a, i- u delete []b2;
: e! W# t, v8 l% t2 m6 ^/ `) N6 H |
|