TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
. ]' o, q" e# ^( C/ S0 F
. M5 ?+ L: s K理了理思路,重新做了一个测试。3 \, E% B& d* a! h' \6 \
做了两个 vector 和 两个 float *, 都长 100000
( z, ]% E+ y1 g9 Z! x. Z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' j4 a+ r+ `8 r0 }! M) }# E7 P" w' s1 M* V( U" t2 i @
内循环试了4种方法,
/ P# _& o, R& l4 D6 t( Q6 |1. 直接调用 vector inner_product 247s 2 y- x/ `, A9 \* s) g* v
2. vector 循环点乘累加 237s
4 y" Z- |8 m$ k1 ]3. float * 循环点乘累加 204s) L2 Q# V( C9 ]+ P
4. 空循环 100000 次 202s9 f j7 U! {" ^- n+ m: _$ a' J
! I8 \4 _, s" z3 x% \
不做内循环 200s/ A' |, m- u! m9 E$ P- I
! c/ d% f# I5 ]" e# w& V( L2 `2 c你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! p2 Q; ]" e, C. R, ?另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
" _- p) {2 F) E2 a7 ? C6 A$ s2 {3 Z/ y" x3 \2 M+ w
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
m: s8 U" r2 b+ b+ u4 C( v" r# C: B: z1 R1 v- A J- t* X
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 E2 G" w( w v8 V' k1 ?# {! O4 \: n- N$ I
std::vector < float > vec1(N);: Y. ]+ Z4 n% `
std::vector < float > vec2(N);
8 I- `7 v* h( \! w4 e float* b1 = new float[N];" Z6 [% b3 K d5 l$ z9 M- D
float* b2 = new float[N];
7 C* ^' _; W3 P4 J/ T% s2 w
% K% `1 V1 d9 M- y for (int j = 0; j < 6000; j++). C7 n: o0 f. Q0 b
{/ k, l8 o4 c8 E; h* k/ I
std::generate(vec1.begin(), vec1.end(), []() {# {4 ]9 O) I. z4 n, o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
+ t2 g1 V' \! `. C });
& \7 |; \( m# m1 f# i( `
) k, W7 A, P2 X std::generate(vec2.begin(), vec2.end(), []() {
# Z. z6 p8 X$ [; k& L return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( J2 k4 s8 H- U: J
});
, j4 h, A7 m2 L6 O
, o/ X9 c0 t5 \: z; i# N0 \ for (size_t jj = 0; jj < vec1.size(); jj++)0 N% M" I& p! u# Q
{
3 _% x8 Z+ B7 y' K( y s; L b1[jj] = vec1[jj];
6 {/ k/ m2 n" d% @! \2 ~* B6 o8 M }
# \4 T3 Z, |2 R) j/ o
# h; l8 s" H/ ]' x" f& Q, B. Q for (size_t jj = 0; jj < vec2.size(); jj++)8 }. L1 K! C/ m" N$ }
{
5 ^+ ]$ L. _! J# i7 H b2[jj] = vec2[jj];- b; A; I) [' w
}
S. C5 O7 h+ y3 }5 T0 c# @. X# M* h
//Method - 1 N=100000 247s
( q# Q- i0 t" g3 o/ v. _ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 S) R9 y+ Y+ W, N% }, K: F0 ^
7 g- |( z# \; Y% e* Y2 p1 L //Method - 2 N=100000 237s! J/ a$ J, c) e
/*5 c) j d# k$ F9 j9 N
for (int jj = 0; jj < N ; jj++)- O4 P8 i5 J$ x& z# p. d" k+ e# q
{
' C$ h8 l) @- t' I# I r fresult += vec1[jj] * vec2[jj];
9 E+ U3 w7 H: D( N }
. B5 l( C& r9 k3 b- V: R' B */7 p1 S7 N( X7 s/ W8 ^3 b6 @
5 g4 k7 z; S- G8 @/ u% G //Method - 3 N=100000 204s. f; w3 E2 l5 h+ @) C, t1 ^
/*
! h8 V6 l( B4 @ for (int jj = 0; jj < N; jj++)8 M0 ~6 [+ m) l- x% J
{% v3 t/ l1 y; v4 B# g; e( a) Y8 v
fresult += b1[jj] * b2[jj];
# k/ x5 b* y* e% g9 R }2 B: f* ^, O% V! Z0 a
*/# v# {2 U! e c$ K* A2 z0 Q- h
) Z% g5 F" L. j //Method - 4 202s* k, G* U( W8 a2 t+ x% E
/*; [( j$ I3 u! h9 \$ z1 ~- I
for (int jj = 0; jj < N; jj++), a1 L( Q4 A, _, L0 n: K
{2 e# M8 M6 G: p6 Y4 D
6 ?4 o) ^7 ]0 }6 C. i) F }
5 W% ?5 v6 V- S */
* k% y0 M0 _7 U& N- C9 w //comment out all methods, N=100000 202s 9 u7 P( w- g/ A4 A+ S: ?
}; o( B# L8 S+ \7 u' c7 u, U3 l( e
; \4 @/ Z- S) C delete []b1;" M# x4 N; Q. ~3 }$ a c a
delete []b2;
) z" Y& a$ m7 o+ l |
|