TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
/ p* |* Z0 T( C" \3 M2 V
! P( f% g( X9 Z# c( q V7 M理了理思路,重新做了一个测试。" Z! n7 t) s% e' l3 C
做了两个 vector 和 两个 float *, 都长 1000009 _9 u( k% @ G1 Y0 O6 P
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
z" O. N t. h% ?. y, M' v8 e9 k: W0 e2 `
内循环试了4种方法,
/ [3 [+ f7 `5 r4 K* x' a \6 K& N k1. 直接调用 vector inner_product 247s
0 b8 r7 |. r: r8 F: k8 `2. vector 循环点乘累加 237s( [* q7 G" I. [
3. float * 循环点乘累加 204s
* ]& M$ j) @ \4. 空循环 100000 次 202s+ V6 N& a0 `8 o: b& E$ Q
! Y5 z+ F! T: l1 R% K. w% c不做内循环 200s, S0 ~* @ u( }
# N3 M9 X9 u9 ]$ S' b3 a9 H3 D
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ e ^, ]+ Z) |1 e8 V另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 i5 j: t0 I$ A5 a
: d6 ]: A4 ^# H+ \9 U8 M6 x; b1 L至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; [* ~. F# m0 P. j/ H. Z: e; Q7 ~) V# K0 D
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). p2 E5 l& Q7 g% M8 y) N3 A
/ W" F+ P H6 }& X: s) C
std::vector < float > vec1(N);1 m( G8 s V7 C% Q, @
std::vector < float > vec2(N);
% S9 q8 t1 Z M2 Y( [ float* b1 = new float[N];
8 c! ]& K* ^. r float* b2 = new float[N];
+ M' v3 q) M" Z- f' E0 ^5 Y5 b1 {; t5 y# z8 i( {
for (int j = 0; j < 6000; j++)
+ u) r$ I, C' [6 e: t: J' I/ X$ b {
$ ^9 S% x1 D h2 g! h+ L std::generate(vec1.begin(), vec1.end(), []() {: x+ Q& ], b. T! N
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
6 E. n. U% H$ w& o });0 n3 p! Q; y2 o: O) y) N
0 z. `, D9 V# ^/ j7 ? std::generate(vec2.begin(), vec2.end(), []() {( V% i2 m- m F6 Y4 P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! C0 o2 w4 H0 o. V( j$ ]$ j$ T% e });$ ~$ r% H3 A2 }1 ^9 z+ {- _2 A
1 {) S6 L" R! z( Q9 `7 B for (size_t jj = 0; jj < vec1.size(); jj++)' N9 P$ z4 t6 F( n
{
8 u, H; q& s) h9 E$ Y9 T8 {: Z b1[jj] = vec1[jj];
$ |6 O* e2 {7 G, I( V }
' w m* {5 K% L3 t
5 M* U1 C5 r3 m. F for (size_t jj = 0; jj < vec2.size(); jj++)
. s1 B3 w& A* \2 Q2 ]" ^ {
3 k: d) M* S1 [3 V' U! t b2[jj] = vec2[jj];5 M# g: f9 J$ y/ b
}& F4 A+ n: n8 ]4 O- ^
' }5 h, G R. y0 X/ V6 o* `
//Method - 1 N=100000 247s
1 x# s- v/ m: z/ T4 r* Z& @% ? //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);8 G6 k' s& M8 W2 v
: N) p6 d6 c3 {/ U0 G8 i- _' s y4 D( } //Method - 2 N=100000 237s
2 ]1 o% f9 j" E" d /*7 x, W( L8 d! l- G2 c
for (int jj = 0; jj < N ; jj++)
! b( k/ P# a# M! P7 t {: O9 M+ Q) v$ `3 a" K$ P
fresult += vec1[jj] * vec2[jj];
3 `+ @/ Q3 t, T2 d* W. c9 Z. J }
^/ @: z, T8 {8 m P: ^ */
+ s; k& K( E$ X* K( X; Z
+ t8 W- Z( `/ m //Method - 3 N=100000 204s
2 e8 {! X0 N; R& g* F6 z /** q& I6 b# E" c; u
for (int jj = 0; jj < N; jj++)$ v3 ]) Y! v$ ^2 [; U q
{
4 z9 r: k4 J5 K fresult += b1[jj] * b2[jj];
: ~' M! ?- R% }( J1 M, l6 e. u0 b }7 D, b1 B' S2 S+ A- r0 y1 m
*/
, K% L5 e- z1 W& r* ~
, Z) P+ y5 j* ~ ~; x5 K //Method - 4 202s' e4 t2 k' M- s3 i
/*
3 d3 A/ k+ G# L+ L' Y for (int jj = 0; jj < N; jj++)
% C+ \: K# s' }; m1 j% W {
q! f6 x+ l" ~( p: O8 h 0 G8 }/ m" y8 y# o3 [
}
K8 @7 r6 Z* w1 o */
1 X; f) R+ ^5 x8 {6 H //comment out all methods, N=100000 202s
+ \7 s5 |- O C1 e }2 g! c$ C; R' P; J
. T5 }6 X& [# Y
delete []b1;, n+ E9 L Q0 K0 H
delete []b2;
, d4 g$ ^# m ~7 R" u+ ~- H |
|