TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
% L" _* A* f9 K( I* }. [+ d8 f& i* O
8 Z: r" ] u* ], ^理了理思路,重新做了一个测试。9 d+ G+ v7 K- U x& C
做了两个 vector 和 两个 float *, 都长 100000
) t# X5 w, n( Z+ Y9 B# [外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& `+ T' m' E2 l5 ~$ ~9 e* I
2 G, C. h- K: {, a. z" c2 u内循环试了4种方法,9 a& p4 V0 Y J0 X7 _6 Q ~3 M2 ^
1. 直接调用 vector inner_product 247s
{/ C6 u; a% b0 y4 }* S% r; y2. vector 循环点乘累加 237s) `7 `* z) B2 Q |: Q
3. float * 循环点乘累加 204s
* T4 x c3 m! @6 Y* `; E5 i! |' a1 N4. 空循环 100000 次 202s
& Q0 _* z9 {/ O( @( {/ Y4 P# q( w! I {2 }
不做内循环 200s6 J% M2 n5 X/ b9 z" q( t" P
1 d* i9 {) p3 D+ s1 ^
你昨天说的对,内循环本身占比是很小的,大头在其他处理。& D) h A6 r( Z$ @
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" x' L' f3 J# q0 w4 w
. M m. u' O" i, X+ b
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
3 T4 n& n* Y0 n$ B
3 v0 W: {1 W* E- q: u- [" t$ K(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)3 Y7 a4 \, U; o0 d4 w5 N5 M' Q
" Z5 ?# d7 a$ V std::vector < float > vec1(N);* a! T7 `4 ]: `: ], N
std::vector < float > vec2(N);
- s7 i; K% y4 ?; T) C4 h8 } float* b1 = new float[N];& {5 b/ w- [- O' d1 V
float* b2 = new float[N];
6 z# @5 k/ Z& z5 E
, Z/ ~* J; v* c+ V; `4 s for (int j = 0; j < 6000; j++)
! S" O0 u) U) j9 q# Q) |5 M {5 E. T0 D' ^' G" B r1 v
std::generate(vec1.begin(), vec1.end(), []() {
* S0 B N' z' i+ d; t% F return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;9 n9 l b/ j, l; p8 E# ]0 g
});8 v$ s. ]# a, g3 G$ H; A8 }. e
n+ s1 X' f7 F7 W std::generate(vec2.begin(), vec2.end(), []() {$ T! n+ ]7 n7 H% k1 y; Z/ t
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! Y, _7 T. l& c' y });4 H; J0 w) H- T* j B% o
/ U# s1 O% h! p; @5 z/ [( I for (size_t jj = 0; jj < vec1.size(); jj++)' k: n$ s0 Q0 J% ?& k" L" m
{1 s- f5 W+ R! Z$ |1 ?
b1[jj] = vec1[jj];2 P" E" O9 |, f3 P+ [- \
}% W+ v' r7 q: D- P8 M! v& x
% f3 I" `( s+ ~4 K- j2 W+ [( s1 @
for (size_t jj = 0; jj < vec2.size(); jj++)
/ L) P1 @4 T5 s ? {
1 m* Z" \5 T" ?5 n2 t) y3 b b2[jj] = vec2[jj];2 ]3 \5 M3 L8 w$ h% M- z( [/ [
}
1 M% n( T+ s" h1 X
/ Y/ a8 c4 i. N0 p& ?4 A0 a //Method - 1 N=100000 247s / |9 g6 {, i/ ~) S0 U3 r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ L1 g( i; f3 [7 |; m . R3 x% h% V) S5 |
//Method - 2 N=100000 237s* l: w$ B; L# G
/*
. ?, F6 }$ E) `* q- b2 C for (int jj = 0; jj < N ; jj++)
& x5 \) S* V7 g" t j4 j {4 |. `9 T7 c0 z/ d! n9 H5 v
fresult += vec1[jj] * vec2[jj];
# ~( R; c/ s! u% U" | }
. H% Y" n# t o( b; |( k9 [7 y. H */
1 A( {( z- n4 H/ c& u" B1 T' l5 z
9 d1 Q; O9 T% ? ?, W7 P //Method - 3 N=100000 204s0 `+ h; \9 z1 L5 g. q7 ~
/*
9 E O7 M M" Q9 [- W' l* Y6 F q for (int jj = 0; jj < N; jj++)
4 `$ q9 z6 T; O {$ ?0 h2 n# s& h, e# C. ]5 {8 h
fresult += b1[jj] * b2[jj];
6 ~+ [( I" ?' s: a, @ }
& O1 ?0 s2 L. J8 |! _, W: r" S9 F */
3 W/ t7 C7 T6 ^$ O3 J) ^1 N9 S( K) R5 G7 M
//Method - 4 202s
; f, f- e+ N. C3 n* b) n* z+ n) P0 U /*
0 @$ T) ]5 b I! e6 |, j for (int jj = 0; jj < N; jj++), ~& W4 n, {/ G+ e
{
}5 z& X I+ ~6 p+ D } % ~! V1 l% |; b1 E! V, o
}
9 J/ H- u/ W0 E5 k' y1 L */
' Z1 a3 q# p7 u; w0 e5 p //comment out all methods, N=100000 202s
) L. Z9 q7 q0 A! l" Q2 k }& J+ ^( P/ o, f0 m! ]) `
1 c3 u# o/ t w' e" q6 u+ z& }& R
delete []b1;+ C- w0 c) H1 Z) s5 L2 c9 ~
delete []b2;
3 e6 P9 L" }+ ]; g* A2 [ |
|