TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* Q9 s: S9 ]" i6 M m/ a0 @, [1 u e. T* ^4 {/ l7 _8 I
理了理思路,重新做了一个测试。
/ H+ B- B7 [1 | I+ T. p/ n2 U做了两个 vector 和 两个 float *, 都长 100000
; ]. r0 a; W" F, O/ ]外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 Q. v5 m: J. {& o0 I5 K1 i
( w+ v) q% _3 }+ y. Z$ {
内循环试了4种方法,
4 O9 n. Y, ^ }% e1. 直接调用 vector inner_product 247s 4 k" i: R+ B8 t C4 e9 s: [" `
2. vector 循环点乘累加 237s: [( w0 ~9 f# J$ w" v5 F
3. float * 循环点乘累加 204s/ K: y% x8 U o# y4 B- K4 _
4. 空循环 100000 次 202s2 [0 W9 F% F) f2 V
7 x8 S( W7 O8 z1 q) S
不做内循环 200s
4 p8 n( a: q/ D
3 w- s9 l( j9 H$ E# E( n. w. B7 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
; o1 ~% u( y3 }3 J8 k3 A另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, t' y- g& b% |' @2 F' }& R8 x
% Q% M2 b( {5 \* ~$ y: @( ~9 P
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ p- f' Y# [* }: T
6 \0 Q# H3 n: i0 h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! G7 k9 t( m$ x* {; d; a9 L0 P
+ S1 E" ~: I# f; R6 A, \# G std::vector < float > vec1(N);8 A7 {0 {8 b9 q, h' J B8 L2 F) _
std::vector < float > vec2(N);
- i/ z0 R, a' o: t float* b1 = new float[N];
6 W3 k6 F3 p/ K float* b2 = new float[N];2 Y' l1 E4 s6 q7 a
* G) }0 M$ t1 X0 e. l for (int j = 0; j < 6000; j++)4 i% Q4 M6 v! z# C+ f+ K" { w5 L
{- K7 l+ J: Q; `
std::generate(vec1.begin(), vec1.end(), []() {1 T9 V3 u5 g5 Y5 c8 z0 _7 ]
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; |5 w; u& |( i
});
' Q! g4 ~4 X1 u/ g" i2 `+ N+ n4 p: Z* J% f: l
std::generate(vec2.begin(), vec2.end(), []() {
" W8 Q) x8 I: ~: l9 a4 P% X return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- F; t% j/ \* W7 c; Q9 F });9 g2 B& N6 }2 y; ~" U% x$ ]
$ K5 r& b/ m; c* V for (size_t jj = 0; jj < vec1.size(); jj++)( M$ I4 P/ i; g" D
{
" Z+ W0 H, [- c& L& |, c b1[jj] = vec1[jj];
2 C9 F3 @' r M: l9 l2 U8 Y }
; P' n; h1 r& O6 P
] @) f2 s% A, s for (size_t jj = 0; jj < vec2.size(); jj++)
2 T8 O% k2 m* A- ?$ E {
+ G8 S4 Z" \' N- A! k! B' z( {7 } b2[jj] = vec2[jj];
. ~" Q* c% Y# j+ ? }" @9 T) v& i* l
% V' |& k& G! G# C# u. j
//Method - 1 N=100000 247s 1 ^8 @ l7 o3 E9 d2 ~; ^
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, G/ u- |/ o3 V$ l% a% ?! Z
7 y7 P1 D4 o4 e9 e# M9 {% h* j" n //Method - 2 N=100000 237s
, x; G% a% }' } /*0 s, f& Q8 B5 f4 {* i- P
for (int jj = 0; jj < N ; jj++); ^6 J7 B# x8 g+ G
{
: B2 @- P% l, {% t fresult += vec1[jj] * vec2[jj];
8 X% J" |. t5 {- ^ }% Z+ \" R K+ B) P7 b
*/' g; I \$ w- f! n) a |
8 O4 C$ ^! l: W6 [" }/ d //Method - 3 N=100000 204s
- U0 K* S5 m+ _ D# n+ G; j+ Z; N# W /*1 B! s; R1 U7 h
for (int jj = 0; jj < N; jj++); Z* u( f6 ~! a' l0 _. I+ n# j+ S
{
8 n& r2 E3 g8 `6 B fresult += b1[jj] * b2[jj];
e, g( [# b. u/ C3 X2 g2 r. q }
4 P7 p4 [% l% } */9 P& I8 T# c# j& |9 i
( w1 N0 c; i- C% \; B //Method - 4 202s+ n5 S) v& Z" g* S2 {1 _2 P
/*: B# R: ^( \: D6 k$ Z* [
for (int jj = 0; jj < N; jj++)
! H' h, c# A `$ T {" y' i7 V" C, X9 d2 @4 |2 g
% G, w( k% J( e& `1 A
}
( g) c u1 } ?: q! {1 z */. k" x% F7 _7 E: @. ~# W x
//comment out all methods, N=100000 202s ' @& v. w+ _1 l
}1 k* C& a% s8 W4 r1 F$ j0 o- P, U
( n' A. X! n3 `4 S/ g4 l( m" Z1 U% F8 p delete []b1; U& G4 V1 k8 s5 R# W
delete []b2;
5 f/ _! B1 _9 `! ]% |5 }) | |
|