TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 G( K u. P. ^) J. @. ]
: B( F1 N0 i6 e1 S8 y$ v8 ^
理了理思路,重新做了一个测试。: `5 k: w( ?% F$ z
做了两个 vector 和 两个 float *, 都长 100000% y9 H* U% C! y- K
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
J0 w' G* A7 i) i; u0 S$ i# q# X. n# r4 ~- L* n
内循环试了4种方法,
K* @) R6 q7 w% K6 Z1. 直接调用 vector inner_product 247s
/ D; \* q# q; q! j+ U2. vector 循环点乘累加 237s
0 d* I0 G# {/ x& j4 T# [3. float * 循环点乘累加 204s' U. H; |8 d+ F+ ?& T! N- O& F
4. 空循环 100000 次 202s4 B$ |$ Z) B2 }+ F4 M. H: N
' Y8 A; p! [& n7 R- Y: H7 M, i
不做内循环 200s% `: U& R0 `- Y9 K* R3 [9 ~8 \
3 R' w/ N" K8 y! c* T) O
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ R7 e1 Z2 a7 Z7 H) w1 ]另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 I8 B4 I" O6 B4 d
8 U6 F1 x2 F) l, \- B1 t% z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 x, G: c# d2 x/ c$ m
+ Q1 a: R1 c r0 f9 l(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! s& h' m# d0 s
0 T2 Z$ I- [: y* H: x5 c std::vector < float > vec1(N);
# f+ c2 b) P+ m/ t& W5 T std::vector < float > vec2(N);
" T" s( R- q4 I float* b1 = new float[N];
* D7 c: z3 F" i5 g# e( O6 f# I- K float* b2 = new float[N];
, k5 j3 b. V f9 n
6 t* u9 d; E" s, k; o9 p for (int j = 0; j < 6000; j++)5 K$ N$ W2 i* y2 u
{6 q0 {& P- |7 H4 X
std::generate(vec1.begin(), vec1.end(), []() {
& w* p4 q5 `8 k return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
+ y j q" S' n; `2 F$ i& q });7 |& p; w) `. o: I9 }7 I
5 ~7 L" ?/ W& v% V; D8 d
std::generate(vec2.begin(), vec2.end(), []() {
! s$ O# d, J" _! q, a) C9 F# {# s. M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& C4 L9 q8 K* r9 ?4 W$ D. Z });
0 v8 Y6 e( V- b6 b, u9 o( x/ ], I
* u R% D- u' w for (size_t jj = 0; jj < vec1.size(); jj++)
9 o* s+ a$ S0 q! I6 s5 f {
( P: k3 s! o, | u7 q' w% k b1[jj] = vec1[jj];) \, e9 b8 ~$ b" T1 k% W( t
}$ b$ h- I( f9 C6 F+ W; K+ q
1 W$ t* O# M! V8 ]! j% s$ z
for (size_t jj = 0; jj < vec2.size(); jj++)
& @8 b5 N0 c) L }6 n {
2 L9 a2 `+ j2 Y9 c$ k4 [) R; D b2[jj] = vec2[jj];1 a% S2 T& l( X5 X+ t$ m0 z
}4 a8 X6 e0 @; ^( W, J" n: ]
" z+ Y3 v; J, H5 @! E, h //Method - 1 N=100000 247s ' U3 y! {+ |' k& o
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( a5 m' ^1 q y7 {3 E8 [2 s! j: W4 i
, m3 Z- q4 |% o4 i //Method - 2 N=100000 237s P: A U4 u6 t/ D3 O' W7 R* N: y
/*& E6 s. T1 |/ Y' ^* \, z' [
for (int jj = 0; jj < N ; jj++)1 _1 k- [4 z z0 S1 y' j! t
{% I8 ?5 O+ W& h( ^9 f& C) |% c
fresult += vec1[jj] * vec2[jj];4 D( F d c# z8 U+ i! P9 ~
}- F" i7 t! C& G6 n8 O& \
*/
L0 ?" K0 p* `( v2 N/ t
& A' D; g S% Q0 r& ]: ^4 A s //Method - 3 N=100000 204s
. T$ X; ?3 `- Z2 L3 e' o& I9 [, H /*/ F4 x Q9 G3 D$ N
for (int jj = 0; jj < N; jj++)
4 F, C! F( D" C7 c3 f' b1 X {
6 L9 x9 Q4 g3 V. \8 J: G fresult += b1[jj] * b2[jj];
# w0 j- f" @0 ~, F1 l+ a, M4 Q }
, d- @" Z: @% G! Q. c */
* _/ S1 v5 H9 g: K! l& S
/ _: E( Q1 u2 ]9 N: d //Method - 4 202s( B- G# ^4 ?6 k* x1 `
/*
8 x) [* N8 T: h( M8 a& M+ q for (int jj = 0; jj < N; jj++)
) k; _8 b' Y( I9 g {
/ ~) O' p0 s1 J, `; ~ 5 G3 W) ^/ Q5 i! ?5 W* B
}8 F2 w$ G$ b2 E) Y1 j/ C" t; A! q
*/$ d* D( W, c4 c8 [ k8 W% B3 t( m
//comment out all methods, N=100000 202s
( `/ Q( \/ W/ S' K }7 h% Z* n2 H- Z' \
. [3 G% C' ?/ s8 ?0 q
delete []b1;$ D" \, ~" X3 _7 f
delete []b2;
; b8 Q4 z9 f K- p |
|