TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) S: Y" |. \1 [# p! l2 l" h8 J9 s& o& i1 D
理了理思路,重新做了一个测试。
4 L" g8 \' c4 z) \1 N做了两个 vector 和 两个 float *, 都长 1000006 m! A2 o+ Q1 J. f2 S: \* ~: }
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) @5 z0 l* H% q: D
. T" w1 H9 d _0 L Y内循环试了4种方法,
, q( Y' M# z K6 K: w8 S$ P1. 直接调用 vector inner_product 247s
* M4 q+ a6 y" m( Y# O2. vector 循环点乘累加 237s
3 u! w) `! p p% c3. float * 循环点乘累加 204s% v, p. C7 W& [; Z. \/ g* t1 Y
4. 空循环 100000 次 202s
# F& e* w; N, b3 J& h/ M6 y0 H3 X/ E3 Q
不做内循环 200s1 N1 [; q' e1 c- y1 W
; a0 m* |' f! U: S" E7 o你昨天说的对,内循环本身占比是很小的,大头在其他处理。0 a( p% ?: F3 x* G8 V2 R
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, S3 {' K( t* @0 q1 w% B
5 s7 H- K: S* P! G* P# h9 i至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 o9 a, q0 t2 F6 C2 M
: x( L+ J8 p& I/ ^/ c+ ~# d(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
, D1 m! x* n, [
; F5 _0 A. x0 R( _. L6 [% x std::vector < float > vec1(N);. g9 D. E) V2 r. ]6 N7 d
std::vector < float > vec2(N);
- s3 ^0 m: e9 d2 l float* b1 = new float[N];
3 K8 E) I% t3 Q7 u float* b2 = new float[N];" J( j7 z) N) i) O
8 a# M4 ~& r/ C7 ^0 f! m: J$ s. A$ A2 G for (int j = 0; j < 6000; j++)
4 G2 Y7 b; |4 z- u- B {
; i6 R& w8 t* {( I/ k: N std::generate(vec1.begin(), vec1.end(), []() {8 n2 O1 B4 y6 V- {; D7 J$ ]/ y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% \: x9 Q, A6 W1 S; i. p# ]
});
5 [$ V) c. \% s
/ [ m" @' k8 r. \ std::generate(vec2.begin(), vec2.end(), []() {1 e& ~% V, I% S- h, t3 O5 o2 [7 p
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
Q+ c6 ]+ o/ Z. `: e });# [' w% _0 Y/ p2 [* r9 n
; H" g3 A B- j0 t/ D
for (size_t jj = 0; jj < vec1.size(); jj++)
, P6 w# A. ^7 E. L0 [7 C* H3 D {% A8 z7 O8 v5 d% Y
b1[jj] = vec1[jj];( h4 a. d$ A) j, I' q$ p( g" f
}
) n2 a& h% a( N: Z4 B: T; K8 U2 |/ \, e% Z; m- k1 R
for (size_t jj = 0; jj < vec2.size(); jj++)" F$ ^; X; {3 n/ E" ?
{" A: A1 j2 i# e, W0 h
b2[jj] = vec2[jj];6 h9 N- i: r7 `% @
}
. \1 G* o) Z$ L+ W4 q7 }$ L% t& c' o! K! b! W& }& m" D
//Method - 1 N=100000 247s ) h- S+ C2 W- U, G4 ~0 i" A1 z6 L
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- C9 h# `0 T2 {- Y5 |7 k
9 ?7 S* a. p% G+ k7 X //Method - 2 N=100000 237s
4 Y# z6 I$ C1 r7 C/ k /*
7 ]4 w2 E1 X% f, t- w for (int jj = 0; jj < N ; jj++)3 w8 j2 b" h; S7 P
{: r& x1 w- s+ F& U: l
fresult += vec1[jj] * vec2[jj];+ \6 e3 Z. X' u- [1 p
}
. \0 U2 O: M+ w, r/ e; S2 J+ V */5 s3 N% z/ g4 v* p% m
1 \7 ]; l% d b. ]# d
//Method - 3 N=100000 204s
4 L0 `+ ]5 p7 C /*
& ~/ ^3 {5 Q+ ~" p7 T6 V( q for (int jj = 0; jj < N; jj++)2 m+ F H& X7 b8 z! ^. z# p
{7 G+ X/ U* w5 M P% |
fresult += b1[jj] * b2[jj];4 d9 o2 x& G7 p# ~) X( B
}* C& `# ^/ |* k( \
*/3 B$ z* [6 y4 D3 X" `: j
2 c, e, |6 _* d( W
//Method - 4 202s
) n' \2 E/ G1 q /*
0 o! D; Z) h9 u. X; d7 D for (int jj = 0; jj < N; jj++)0 ^! o0 h" A# U) z `# U
{
! C- q" @* Q3 V! z+ l; J% {
8 c; X+ C: x( Q* V* s: @; H$ G }1 i3 m% R5 X7 c% W, @- R; f. }; x
*/
' z" q4 t% b# f: V; n) o) \ //comment out all methods, N=100000 202s 6 L! e/ y; \) c7 t9 p
}
! {; h, n. p1 J/ y I% k! ~+ `: B( N7 i+ a4 n2 d/ c
delete []b1; ]# D) g2 _; R. n
delete []b2;
! A% C5 K9 [; z& \ |
|