TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 S |# d7 l' G3 x" }9 d% w' F
( e3 I( c3 I6 A9 N( E9 [+ L9 r- u1 v
理了理思路,重新做了一个测试。
( e( f* S' l% \8 _* J1 d2 p做了两个 vector 和 两个 float *, 都长 100000
: S; x1 r: W0 t5 j% i外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. M/ }; Z }0 P* P. A
2 E: x- _; h k9 U5 C7 Q5 |# X
内循环试了4种方法,
% h+ i5 k7 S) t. [1. 直接调用 vector inner_product 247s
" ~& ]2 h. ~, g& w/ e2. vector 循环点乘累加 237s* m$ i0 p0 Y3 C- U
3. float * 循环点乘累加 204s
4 s( v" s% y2 T. i7 L1 B) C# v6 s4. 空循环 100000 次 202s
) y% X6 ?% f- ^6 D1 b
# Y& I0 f- m! ^8 h9 Q7 F不做内循环 200s- E, N: S4 I5 i, q& Z
! o' c0 [% m: z& u
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ e9 p8 i( B. n1 q6 ^9 i另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
. V; ?9 X; L h" ]5 k0 S3 |# j7 w2 {. t, R" |- k/ c
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, ?3 w5 y. y1 x ?# Q/ y, `' K
3 U/ a$ T9 Z' j, @2 w(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) U5 x8 O* [3 F8 G. X3 F) R7 z( n3 X8 d: G2 y! [# n) }5 w2 Q( G
std::vector < float > vec1(N);
4 g$ U" P$ G, _$ ~7 C! z std::vector < float > vec2(N);, J9 l% ^0 m; @" |; v% Y8 H- f) N
float* b1 = new float[N];
* d. Y+ m4 L' ^) y9 {! `1 a [0 B float* b2 = new float[N];
! A" _, V1 h" D0 J1 g; i$ r1 l h& b3 t+ w6 o2 ^: N, m' w* ]1 x
for (int j = 0; j < 6000; j++)/ F) O0 ^* H y
{
% n* m0 i9 o# T- L2 f std::generate(vec1.begin(), vec1.end(), []() {+ Y# M- v5 A4 I" Z4 m. Y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 t& Y0 t% M# f) Y/ Z$ L3 @3 G' p/ {
});
, S L7 P% r0 J( {
: _! m4 f. Y! i- a std::generate(vec2.begin(), vec2.end(), []() {
8 g/ @& A# N+ ?1 c; ^$ W. ]- m, O& B return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 T2 K6 l* O' n0 L1 I, L0 ?
});- l- L& c* t6 c7 V7 G( y
- `; H8 e h: W" `1 |8 O for (size_t jj = 0; jj < vec1.size(); jj++)
( M4 w7 ~& n9 a" V2 m0 f: c1 M5 U {. X$ f, N( d5 G
b1[jj] = vec1[jj];" L' |% \/ j6 |
}
# D! `& i8 f' q1 r- U3 b, j
: c7 C8 s; k: [- \5 ?+ H for (size_t jj = 0; jj < vec2.size(); jj++)
* E* j; f: l+ A6 v' D: E2 c( t9 } {
# [5 l) k. M# ?4 M) P: l* l b2[jj] = vec2[jj];- I( r) _! L+ w# M7 h2 b# n, d6 k; C
}2 E5 n' z: q) @( M l/ Q- l' E
" \+ O* o4 v7 }# d, g
//Method - 1 N=100000 247s
' t8 i0 f2 f& U- U# S6 I //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
4 P8 G8 ~5 D4 ?3 C7 E; o: K / f$ O6 P6 |; o
//Method - 2 N=100000 237s
) [: X) E7 S; q: X /*2 n% ?) C2 r& d8 t6 {) g$ B1 G
for (int jj = 0; jj < N ; jj++)* }4 C }" L! E4 W" }" j
{% B. I) Z% ]- x( N
fresult += vec1[jj] * vec2[jj];
% K. x: X# {& T) R }
. Y+ m W2 s1 F. v2 X */
) b D& e/ ^) D2 c! t: `1 ^ & F6 [$ L7 i1 j; l {' u! M, U8 H
//Method - 3 N=100000 204s
5 V; i6 X3 ?1 j0 ?2 ~1 J: \( A; T /*
% W; ^! l; ?3 U0 J+ g: F6 Z) F for (int jj = 0; jj < N; jj++)4 q. T A! o: N' \# R" a5 _
{
[, {* o1 x" J. C! r6 y' J9 B* p1 [# t fresult += b1[jj] * b2[jj];
$ t2 T+ P; _1 e- A# J3 y) i }
2 u1 a2 \6 P& \9 j* q" i. p */& j2 V6 K- r) Z$ |& i8 b9 v5 E6 A
2 q6 q' [! G% R: D$ }; h //Method - 4 202s3 J Z4 R5 Q2 k. H" S7 [. a3 S
/*6 j: k# i, q0 `4 A/ p! u
for (int jj = 0; jj < N; jj++)
/ C7 V" V% m* J. A. T {: L3 Q7 C0 H& N/ z# \
! \/ @1 c' G* @ }1 n3 W8 f3 Z/ M; a- m; G- A
*/
8 x1 |- ~) h! {5 {$ w: m" k //comment out all methods, N=100000 202s % Q& ]* K) I5 ~
}
4 ~ L# w" {- w; r
; Q( h' I4 _/ t# Q* a delete []b1;
7 r+ [9 s8 e+ z6 \. P delete []b2; 8 J7 I- ]! b" ?. l
|
|