TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
# q9 M3 V0 v# }2 R9 x/ q+ _8 O9 z4 z, [, n$ b
理了理思路,重新做了一个测试。, x- W5 Q' {1 Z3 y: ?
做了两个 vector 和 两个 float *, 都长 100000
% I+ t2 K9 ], D外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 D/ { N2 R t* W! v
/ Y- Q" L% y( j. _# o3 O3 k内循环试了4种方法,5 V3 @0 E! H/ ~ Z+ V: g, \ ~
1. 直接调用 vector inner_product 247s
) C& G5 i2 T7 r$ r. k) l2. vector 循环点乘累加 237s
7 R+ z4 s3 I. Z8 R+ o3. float * 循环点乘累加 204s
/ |! b9 [# Z2 U0 Z! u0 d4. 空循环 100000 次 202s
F) `* |! ]1 } l' |) j
# q! T9 K- F- y) y不做内循环 200s7 g* [; b9 C8 X0 p* p* b
( d- J# g6 |9 h5 V' ]5 E
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 S* @! O. Y0 `另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 U6 r4 Y) R$ ^9 k2 M5 ~) C) d4 C1 e1 X- r8 a/ Y$ d
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)% `8 t: N) `8 G
0 l2 i' |( f" C7 U J7 R* Y& f
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 q2 [% W0 @% n0 ]7 i$ \" f, C- |! M9 N" ^7 u) Q- D
std::vector < float > vec1(N);! U2 j8 l" o: T( C& t. J
std::vector < float > vec2(N);7 T0 J9 w6 C( V: a) l
float* b1 = new float[N];
5 Y/ J% b2 u1 }6 A4 X float* b2 = new float[N];/ @" P0 T% F% u" p
( N r& b" z9 t: @" v6 \8 v for (int j = 0; j < 6000; j++)7 a; {- F$ X; o1 T! F/ Z
{! p5 [* X* p5 [7 H, K5 P$ j) ^- {
std::generate(vec1.begin(), vec1.end(), []() {
8 s! j, |& y: @" n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
?# x+ ~/ U: u ~ });
0 e$ U' t, n; q6 i
1 D& a1 w4 S J. k4 s* t std::generate(vec2.begin(), vec2.end(), []() {' {" Q7 ^+ P8 M, P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( r a3 `! M* L G7 V
});2 {6 ^( u, d i8 ]' R) O% F" h% a
2 l( ~. O: X8 `3 S
for (size_t jj = 0; jj < vec1.size(); jj++)
1 u1 z* T' T3 i1 f, K) u {
; }- I$ ?5 v* {3 Q* { b1[jj] = vec1[jj];
6 p# l" e6 q. [; I* a0 p0 L/ H: V }* z' M1 }" b) f$ ~
/ P* g5 E1 a! V% d+ D$ Y/ s# n, K) e for (size_t jj = 0; jj < vec2.size(); jj++)
! y$ y$ E# M0 X* s {
( ^: x* @3 A: {& ^: f$ v) A b2[jj] = vec2[jj];+ P8 Z, o# W, R0 b- w4 _, ?" f8 o
}
- n6 {$ C! \9 y8 W9 X, _
+ X+ O, I; e$ b //Method - 1 N=100000 247s ; _( J0 f* C5 R9 c K, `
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 c4 n( W# X2 p4 y9 m8 O
6 A: y+ k/ t$ k( X //Method - 2 N=100000 237s
, _9 q+ I9 g8 [& R# Y3 _ /*
& S7 W: g$ ?7 X& n; s1 H6 u; G for (int jj = 0; jj < N ; jj++)
) l0 E! J* U8 I' ^: m: R: z9 { { ?" d" U7 R; u; }* m* w
fresult += vec1[jj] * vec2[jj];1 l" V3 ?, |; a) r! L
}
) c h7 B4 s' \4 s' N/ e */5 J3 v5 v4 i# `" A, ~9 ~
$ R. F9 f( T# ~# Z5 `6 m
//Method - 3 N=100000 204s) S; ?( N% X' q5 i
/*5 P& q0 k z0 O0 ~/ [. M
for (int jj = 0; jj < N; jj++)
8 c4 g5 V4 I0 w- x {4 X1 I3 G. G) b7 ^9 }/ p
fresult += b1[jj] * b2[jj];
: W3 M) O5 @; n; K7 O4 Y$ U" s' J }4 W& f# k: F' z8 w H4 D6 a! k
*/
# T ?; B4 e- L; y
( P% ]; W4 \3 } //Method - 4 202s& t& o% Q4 }, c5 A, t$ Y0 S: B- s
/*
- s1 |8 F1 O ]6 F$ m for (int jj = 0; jj < N; jj++)1 M, A+ V% ?- O2 H [9 z
{; Z* m8 U$ j( {
3 V& b- |0 i4 }3 ?) @3 L }5 E) A ]4 x: \8 g( C4 e* {7 b
*/
9 h" _2 ?) R% C- ]% d* Z7 H //comment out all methods, N=100000 202s
: S% E8 j1 b" @( l* e, p }8 c& [5 k% g; T. o4 \
. Y9 h ~" e/ u0 d G K4 k delete []b1;
7 a' O8 f! h' O* S delete []b2;
: ?* y. m: Y3 ^# c+ F/ _8 [ |
|