TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 C- ]1 A! _+ x$ l& t* v ]6 ?7 f# \0 J' V
理了理思路,重新做了一个测试。
' i0 Q: ?5 F+ G, s! v3 y+ B做了两个 vector 和 两个 float *, 都长 100000
" I! |3 Y& k$ v+ E8 v v4 q外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ n' L0 j! q. m( W# G/ z v& V5 U q( w
内循环试了4种方法,
. ]+ K4 q" r5 F! q; u1. 直接调用 vector inner_product 247s
- Q" a0 X* f, c- ]3 ~1 o2. vector 循环点乘累加 237s. y! ? e. L% s
3. float * 循环点乘累加 204s' |) q0 H1 H4 T9 m. D- M0 p
4. 空循环 100000 次 202s3 ]$ d, a C- K$ h
- H+ G6 [8 P; v5 X( g p
不做内循环 200s; r1 R( `) Y) R1 u. b4 ?9 O
9 y- W7 l8 k# p! R5 J$ z
你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 s' O5 \6 M! z8 F% z4 m, k2 y7 K; v
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
' K% E0 l- S- S: o @, w) {/ p; H8 A9 K! b4 D' ~
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& L2 E0 ]. Q+ b7 [, P
" ?1 k! g/ B, `2 T% Q8 W6 R
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 `* J C8 Z$ x! G0 k9 r7 l, J; M% a
std::vector < float > vec1(N);
! }2 q$ o+ W( l std::vector < float > vec2(N);
5 Z4 I3 o6 X2 _% W# F+ q" k; x float* b1 = new float[N];+ l0 S8 v' \) m8 Z7 O( g1 a
float* b2 = new float[N];
$ q5 e& T. U; X4 p- u
1 a5 b2 w- |( b! C& e% B" w for (int j = 0; j < 6000; j++); m1 _7 J4 L; ]
{
, n8 |7 V7 K: T w std::generate(vec1.begin(), vec1.end(), []() {( K" a4 i+ _9 \5 E
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- p& u. f8 r+ t: Q: W7 r( i });; W5 n( z: k9 ^% E4 {
' e* n- p- G, ^" C: ] std::generate(vec2.begin(), vec2.end(), []() {
5 u V5 v" w/ y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 |1 i' E; q: Z });, |" t( _+ V9 O- h9 ?) I
" Y- ?5 s; j4 u) M3 W0 M& J
for (size_t jj = 0; jj < vec1.size(); jj++)
$ ]2 Z6 X) W- K; m {
8 R8 E# D$ ~) v7 a; P$ y1 v+ V b1[jj] = vec1[jj];6 A7 A( m) f- T) S
}
/ Q- q& M) H- T4 ]! M9 N1 R4 q2 A, i6 q5 I( A
for (size_t jj = 0; jj < vec2.size(); jj++)
9 X1 ^% w+ u7 Q+ a. P' g3 o/ N$ O6 Z {- D4 d6 \, U8 P. b
b2[jj] = vec2[jj];
) G: j& D+ c+ I' E) W$ ^ }
8 P, c4 @! s4 ]7 l: C6 m5 J1 |$ {1 t" u
//Method - 1 N=100000 247s
) l% [3 b9 M! T' W5 m //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 {! u/ {0 E5 s/ `8 N4 k+ B
$ s9 U4 p# ~. q% m0 Y //Method - 2 N=100000 237s
& T# ?1 W' {) B' @% J9 ]! b /*: K) Q- ^% ^" p5 @% `$ }. G
for (int jj = 0; jj < N ; jj++)4 X! c: D) c& W0 M" t
{; e8 `( ?8 d" ?
fresult += vec1[jj] * vec2[jj];0 w+ O8 H1 E! s: r, Q/ I
}# I0 |6 h+ ]$ }% n0 ?
*// T/ r+ F+ u1 t4 W N
% K4 S4 h/ V$ n( b$ H( D2 ] //Method - 3 N=100000 204s/ l2 _' n3 e" v" ~' y1 y- P
/*
6 Z. f, ]( B* h3 y2 H for (int jj = 0; jj < N; jj++)! _" c0 F! e: S/ Q( {$ Z7 L
{
6 J2 n4 [% w* u& Y" W; G fresult += b1[jj] * b2[jj];0 H" N% I& v9 E! R" e
}
5 w3 O+ q. @: I */
8 c( z8 E) ^& r" N, t; u
2 J: C1 `9 \( o. q) l //Method - 4 202s3 |. C) l* [( B) k* @* W8 g
/*
Q+ H/ @4 t/ u' s+ h7 _( R for (int jj = 0; jj < N; jj++)
# e. b5 Q0 h: W9 M7 ` {
5 Y+ [ p% b# `+ ?2 K+ G' n w0 E! x1 Y
+ w) C* k$ g0 r' f% l }
$ u; V6 Y9 m9 A */+ Q, Y s9 L9 p0 m) F6 B6 m% {
//comment out all methods, N=100000 202s
% X/ z, X2 m/ j }# ~2 V2 P, ~0 i+ {
# f8 @6 s) b" h1 j. K8 ~5 q/ V
delete []b1;" L# L R' o. F, Q
delete []b2;
+ {* z0 N9 c" q3 V1 z6 r" i |
|