TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( f N- `$ X/ ~& [. r5 U; V1 ]2 X8 B, W! W1 D# p+ F
理了理思路,重新做了一个测试。
- ]; g- `- d' M# P1 M做了两个 vector 和 两个 float *, 都长 100000
% r g& o/ b" W! z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
3 Z6 o" U2 c2 _/ Y2 U6 k$ x) _" c. B' P' A" s: w5 a; G2 {& @3 u: C
内循环试了4种方法,
" Z3 c) ]; i6 l1 j1. 直接调用 vector inner_product 247s 2 r+ i$ f9 e" b/ Q0 V: f
2. vector 循环点乘累加 237s
5 ?# U8 B8 Y1 ?: b# z3. float * 循环点乘累加 204s1 b' [& s M5 ?3 V
4. 空循环 100000 次 202s' Y9 }* b# w, Z8 K# Y: ^. M
) y. }2 j2 A& w1 e9 X0 O不做内循环 200s
2 c; D! {7 D- x( q( {; U- }5 g+ s4 c' n9 l) `/ \
你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 y0 f/ p8 v! P4 Q% s4 w2 N7 {
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
# m" q" g- W- M" a2 F- k6 l7 ~& d. z7 N5 r
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
: o9 U7 B4 J n; E1 n' h8 Z" [7 v2 S7 `: a
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ W1 p$ O, I& V; c; r7 S
2 r, R$ v9 ?. k7 Z; C# w+ e std::vector < float > vec1(N);
1 H A! C+ S* r% B q std::vector < float > vec2(N);
: o9 r: n* f: [ float* b1 = new float[N];
' W. o" ^* ]; t float* b2 = new float[N];
, b* ]' m0 R+ k! _& x2 {
7 s, F8 X& f+ q for (int j = 0; j < 6000; j++)
: R3 {, g" m1 Y3 h% h {1 J; a6 A+ @9 v6 h
std::generate(vec1.begin(), vec1.end(), []() {, u7 t% l& f, y# m) J8 N/ s0 l5 \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;( M' {! D- E1 D F/ D; A4 e/ N
});
# L. U# c8 C6 M& |2 E0 C& W+ o$ t% _) H$ R
std::generate(vec2.begin(), vec2.end(), []() {
$ B1 `; ~8 f+ s9 `7 y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' ] b5 O( D0 T& ~; w0 M O; H });
, B. s! |7 |1 I0 J. ]7 \. z, ~
for (size_t jj = 0; jj < vec1.size(); jj++)
" W3 W- R# G# K3 n2 j2 D; d {2 @' o8 Y8 n6 [3 [" O1 v( \# h& K
b1[jj] = vec1[jj];* H8 M% U2 I$ ~# R7 g
}% B7 g1 i" U5 O3 V: [! f
; g) g3 V2 s0 M8 I
for (size_t jj = 0; jj < vec2.size(); jj++)4 H2 F/ x5 }- u8 |" x# s
{
, U" E' v g6 o8 b6 Z4 y* r b2[jj] = vec2[jj];
% W7 ?8 i$ |) r; T5 ^ }
5 u; p6 H, ^% t) V. h$ w3 G' ^' s8 U8 c/ H# d
//Method - 1 N=100000 247s
% n7 w1 R* @0 ]8 u2 ]3 B //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. x' Y6 l: ~+ @2 F
' q+ z, v; ]' @4 N. w //Method - 2 N=100000 237s
) h2 Z9 u% ]( i+ M /*
/ t0 _/ G" U# {( w/ s' @ for (int jj = 0; jj < N ; jj++)
\ \5 ?1 }: { {
7 k4 e& ^2 t' F z3 h* J: O fresult += vec1[jj] * vec2[jj];
; r- O1 `8 C& G7 Q) } } j3 S* |5 m" v& }3 `0 d1 h. K
*/1 f; Q+ Y) Q) p# b# j, q6 L# I. E
, ?* c' v& l i! @' W+ K1 k' i
//Method - 3 N=100000 204s
' C5 K s% Q, E( g% t/ B /*
. c4 s- N5 x1 b; x- z7 F for (int jj = 0; jj < N; jj++)
$ b5 T" q! ]0 ?+ o( A6 p1 f {
X3 Y2 ~! G: s2 P fresult += b1[jj] * b2[jj];
# P5 I& j+ D: b7 n' U2 S& n0 F. _ }+ O3 p+ ^/ R' G/ m! x Y2 y
*/: x2 d8 d7 a( y. l+ `2 R
+ D% p: \* Z, Y% ^( I3 {. G
//Method - 4 202s
* U3 }7 V# o) P# W) Q /*
/ I1 B$ W# R# j. ` for (int jj = 0; jj < N; jj++)
" m% x4 q4 n- M. D- ] {
, c4 ]5 r) i6 e0 y3 L6 ^) @ 7 W9 X1 s4 z2 V7 i+ m
}
4 |( a8 _7 ~6 E6 Q) T */
: c! e# p$ m* r) { //comment out all methods, N=100000 202s
1 m% U3 H" t( x+ e( I }0 C# g" u% H Z/ r/ D* l' t
+ D. F: ?8 v) O |! d! h
delete []b1;
8 {: u) i6 `/ a delete []b2;
# ?! K2 q% ?/ v: P |
|