TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 , D& K# U/ J( u. ]
+ H3 A+ P, W/ D$ y理了理思路,重新做了一个测试。
4 j% x& H5 w3 n Y6 O: j# M' ]做了两个 vector 和 两个 float *, 都长 100000
' b( W" S. v% g外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 G0 j: e/ |% {+ E$ M) ?
1 r. m& U4 g+ m+ y7 f9 q内循环试了4种方法,$ L$ p/ g% B$ _" t9 y
1. 直接调用 vector inner_product 247s . V$ M, b+ X6 J+ b- r
2. vector 循环点乘累加 237s
0 p5 {: Y+ w* H1 F& P3. float * 循环点乘累加 204s
$ W6 R0 J- N( t, N q G) E4. 空循环 100000 次 202s
" |* H5 |" Z6 L' |' X( X4 R {5 @" Y! G4 Y" [; ?3 A
不做内循环 200s. i2 j( y- N1 f& i( P; F# w; g
9 u T3 m7 @! |9 W. j+ D; e. J你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ }8 Q, U4 ], E; S7 G& N4 O! N
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! Z& r+ J: X- _, D
4 t* u2 s1 b5 l/ H2 v" B( B
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" e% C; d7 b) k& s$ _9 ?4 x& Z; }
2 R; L, [" V% _: d8 s(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
3 l& |7 i* ?1 w5 G% r$ v X
$ c' y- Z, z" j5 f K. ` std::vector < float > vec1(N);
$ u8 U+ R% S4 j: l9 Y# B) Y std::vector < float > vec2(N);. N4 ^% G! @! r+ B
float* b1 = new float[N];( k6 y8 W! O& t; A9 N$ L7 L
float* b2 = new float[N]; x1 D& l3 f) o/ k
) {9 O/ q9 C5 o% G$ Y
for (int j = 0; j < 6000; j++)
6 s/ s" U& d- Q {* k5 E/ C7 M; _3 r& H6 ^ H
std::generate(vec1.begin(), vec1.end(), []() {6 C% A0 Q+ s* _ L: `' V) K+ A
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; C, u8 f# o4 K; v I4 v) N4 V2 R
});# A# a! e& i3 P: W
7 R7 m- q7 I: l I
std::generate(vec2.begin(), vec2.end(), []() { H0 e2 J: V5 l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# r% e. q/ N3 q9 f" m0 Q U
});
' k: h8 i- l v2 H7 f* i0 m
5 x$ l+ u: U% n# i& B2 }0 ?$ R, L for (size_t jj = 0; jj < vec1.size(); jj++)
0 ]9 O3 X) I7 F. L) | {
2 ]( X- ^3 F( i5 E2 K b1[jj] = vec1[jj];
- S! ]+ _9 I7 Y" I! G3 ?* _ }, h+ }2 a% O$ V- ` m9 C
9 i- G2 e9 r% N( L- K! e/ N for (size_t jj = 0; jj < vec2.size(); jj++)0 \ J* B! a( b% q k) i/ a
{
) j- j3 `% Q9 o) p1 N b2[jj] = vec2[jj];
, l! s2 B# ?7 W0 y* E8 [- y; @ }8 y- I% H0 J, c9 |* X
# k& r; r7 {$ B3 @* H
//Method - 1 N=100000 247s * N; Y# b6 w6 m5 v; S7 K
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);$ r; W* w1 e6 B6 g" S [
4 C( _0 k7 [1 \+ d* {$ R$ h
//Method - 2 N=100000 237s
$ U5 D: z! `+ F /*
& f# j" M: `8 ?, g for (int jj = 0; jj < N ; jj++)+ Q& f; @8 S; Z1 z! _+ ?$ {- G
{
. M7 |+ u+ y- J( ~8 ?2 V7 a fresult += vec1[jj] * vec2[jj];* |1 f) `. }1 z) u2 w' u0 e V7 F6 D
}+ i) c& H) F5 [ D, G/ p
*/
2 @- L; |9 Q. X& @) o; Q
9 O9 @1 C! A9 p1 _+ L //Method - 3 N=100000 204s+ }, o8 B# x, ` V) Y" F& n
/*
6 P/ X$ j. P @( V* U( n% x for (int jj = 0; jj < N; jj++)
* S) a+ {+ P+ T2 v {
0 y$ D/ Y9 ]( N- z1 U0 o fresult += b1[jj] * b2[jj];
/ l; h3 f0 \9 j }
7 l* d+ X) o" A6 ~0 O */
3 L1 j5 p( R2 Q" b1 ?& w5 A3 N: N& D0 i' y: G4 ^7 D1 ~* i
//Method - 4 202s. Q0 l% c( Q0 V. K
/*, d3 X* K3 _" O3 \
for (int jj = 0; jj < N; jj++)
# M6 ^$ [% y5 s& y8 K {
( [0 R8 M: b0 A6 \, o& H: n' r' s' f
( g2 C- |+ W2 |# [' H- { }( I6 i7 j) Q4 E: |0 O
*/( ]" x8 \% W6 e) L
//comment out all methods, N=100000 202s
# d U+ \* a4 c$ L' F+ k0 p }. w- v' m4 A K( l
9 L/ t" s( d, k p3 T
delete []b1;
' c, h2 }, H+ Z+ P7 [9 u# T delete []b2;
7 Z$ ~. c3 D; `( w& A |
|