TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 S" V( _( r2 s) k# I
- x* n, |" Q7 c8 ?% g9 t- M理了理思路,重新做了一个测试。) z6 V4 w. ]. s/ |/ M1 A
做了两个 vector 和 两个 float *, 都长 100000
! {9 [. i( N! W7 @/ m8 r! Q" J* r外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
2 z' v3 W1 B7 y) W; }/ E9 G) [9 L" y* w i( ^' m# U
内循环试了4种方法,
' ]/ @( H% \* [1. 直接调用 vector inner_product 247s
0 M8 H5 ~# X7 Y2. vector 循环点乘累加 237s* N1 R1 R m2 r, W( k# l+ J
3. float * 循环点乘累加 204s$ S1 R3 r8 `4 h3 M3 u% d
4. 空循环 100000 次 202s/ h3 C8 d; w ]
1 N; e5 O; K( s: i! j# e不做内循环 200s
. A, L* i q' |6 M2 Y9 n8 t" ~/ ?
你昨天说的对,内循环本身占比是很小的,大头在其他处理。# _" ?8 Z7 f; [$ b) k e" f
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- D4 | e: r. R8 t8 U' k2 _7 O( E
! n4 j% F) }, d/ y6 q5 c至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( ?" s" j% G1 c0 E) r. m1 u P4 F( {; O* x8 Q& R9 w; N, u
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% y1 F2 I* I# g: _2 [/ { O* W5 x$ H s- _% L' o" X8 ^5 [6 Q
std::vector < float > vec1(N);0 i6 P' d" T: R Z
std::vector < float > vec2(N);1 l" e0 v6 D2 P0 K& o
float* b1 = new float[N];$ A1 f* }8 w* p: |/ {! @3 f
float* b2 = new float[N];
# d) \1 |7 @2 E! z2 x
5 i' I9 ^, [4 _$ q for (int j = 0; j < 6000; j++)- i% `6 ?. ~0 h' r
{
& h: z2 F2 \, n6 g) B9 ] std::generate(vec1.begin(), vec1.end(), []() {
: p% p5 }) M L8 y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ T1 L9 M. q0 ~* E: Q; L8 O) B
});
5 M3 N4 i: H$ l) l! Y1 h
& |9 M4 `# a# A: n' \ e std::generate(vec2.begin(), vec2.end(), []() {
$ a7 U2 n3 P2 g- {, `; W return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;. W9 U# c5 d" F
});7 T7 k/ n$ v+ U% F( g, o r6 _: E
/ i) Q* U: y* g* N7 u' U" v
for (size_t jj = 0; jj < vec1.size(); jj++); p: i. H# G4 g' A$ K1 ~" I
{2 S9 j1 f# H# N0 I! }
b1[jj] = vec1[jj];
& x! Z! U3 P K8 R. u }
5 i) [2 K! r; m- m2 n) ?
3 r+ g: B0 W. P1 p3 X for (size_t jj = 0; jj < vec2.size(); jj++)+ X) o- a1 H! s
{
" a! C0 W0 V, N! X- E; B9 E1 ]( } b2[jj] = vec2[jj];3 G0 G0 x, V. C' q) y
}
) }2 R3 Z+ |9 I
4 W8 ?" q6 G1 y: t, A' E j' f //Method - 1 N=100000 247s + M4 A( \& D$ B+ @
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: r, j6 }6 z" }0 w* `
- G$ N6 ]8 m" D- R+ T6 _ //Method - 2 N=100000 237s
* T$ _( k# O- W% {( O! } /*1 F, }; Z6 J' R1 C0 q( L
for (int jj = 0; jj < N ; jj++)3 n: ^) M- L+ Y# w
{
3 O" Y" H* @5 F, R$ y fresult += vec1[jj] * vec2[jj];
% p |& T" v8 {4 Q$ w8 B0 P }4 P: c* B" O9 \
*/0 X, y. A# ^& ` X7 d6 h l! [* s6 [
2 B" q% \1 _$ \4 c. `4 ] E
//Method - 3 N=100000 204s$ L* a9 u) G, v( K
/*
1 g" F; c2 _8 N6 e for (int jj = 0; jj < N; jj++)
: m: G4 O3 H- W' X2 e5 j: ` {
# F E) `# J' A+ {6 v8 g8 g3 v fresult += b1[jj] * b2[jj];
' ^/ h4 z1 |! a! l* Q }7 i# @. C& o& q8 j: X1 Z
*/
2 e: ?" T8 A6 O/ V2 \ \2 l( Z; k: K0 {$ @/ r3 ?% v
//Method - 4 202s0 a% s- x2 |! H, V o
/*
9 n0 a9 {0 K2 G/ m for (int jj = 0; jj < N; jj++)
9 B$ J+ S8 E, O! \ {
2 x6 V- x) {4 K+ T" ~6 l
- y2 f3 z) k) A: L6 i" K: U }0 _, x2 l. q" A" S$ N# W) o: k
*/
( M" f! k4 R# \- `! j1 r7 u //comment out all methods, N=100000 202s - i* ^4 F6 k$ @8 X7 }& o h- ^
}. m, d0 ^% W8 V; K9 k
% b* _9 s8 Q; A* F3 E delete []b1;, ^7 S6 e5 m5 o! d, B0 b! m( r
delete []b2;
7 W: s( Q! {" g+ P1 ~) F* \! G x |
|