TA的每日心情 | 奋斗 4 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : m" O! s0 {) U4 l
% H0 ~3 ?: [$ {2 [5 j
理了理思路,重新做了一个测试。- _( U0 d3 V7 R9 S, R0 ~! G4 K
做了两个 vector 和 两个 float *, 都长 100000- a9 P X3 }7 h
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 H* ]1 z/ v8 ~2 e; g3 Z
% N, h& k, e3 y$ A内循环试了4种方法,
( W# ^3 g, b9 W9 v2 U% y e1. 直接调用 vector inner_product 247s
, X0 d' _6 e* R5 W; V* u2 ?2. vector 循环点乘累加 237s
' Q" Z; |2 r: s7 n: M' Q3. float * 循环点乘累加 204s
' u3 ~5 E3 S2 s8 w( a$ ^- \/ e4. 空循环 100000 次 202s/ f2 m6 o: Y- _$ M; n2 J0 T
. h" C- [3 Q9 c! h
不做内循环 200s9 a. P8 h/ ~3 B2 q# S5 t
g( ~6 J( {# s) S# a你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 M+ T B* r8 a9 w* j- b另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, e$ W |/ o1 V8 y: }5 l
) r; F/ y. e Y4 l5 S0 Q* j
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( o2 ?' A- j, \8 c; d
" U; k) J" X2 n9 @* {0 Q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)% W& B9 e& [6 I5 J$ [. t
6 y! D) |6 w: V0 C std::vector < float > vec1(N);: p, I. R/ V3 Q F
std::vector < float > vec2(N);& f, p/ U' D2 O. h1 q# O$ R
float* b1 = new float[N];
; b7 F# x. L, O! v! O/ ~5 S: J' @7 d float* b2 = new float[N];
0 i; X3 R/ }% Z. T$ k
* ^# C2 y9 P! y3 q% F/ A for (int j = 0; j < 6000; j++). _2 h, n) ?& G4 L
{ l; z7 P( i1 l4 I
std::generate(vec1.begin(), vec1.end(), []() {- S; o9 d' h" ^5 G) O
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 _9 f0 o& p0 x7 c0 l
});* n# p I H: k' J% ~) C5 F. N1 [% b
6 p- h% m& i' M/ M8 G( B+ q. ^ std::generate(vec2.begin(), vec2.end(), []() {. {3 P. j1 J5 p- z& }2 f# ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& M6 ]6 X! E: `2 ?+ G
});
+ R5 x9 s, F: k) k: l! N
5 }- S) X9 u2 Q for (size_t jj = 0; jj < vec1.size(); jj++)
1 v, `: T* ]5 O8 J {+ r- i; q$ b: ^; c1 D
b1[jj] = vec1[jj];
" C4 G" d* o, u" v. g# I }
+ r0 R9 f) p2 k6 _$ F6 t
1 m4 w8 `# ~) [+ F for (size_t jj = 0; jj < vec2.size(); jj++)
' ^" n% i# L( h4 M {* B) V t! r/ H
b2[jj] = vec2[jj];
4 r/ E: f4 d2 \4 I, j) ~ }8 u+ g# s5 M+ @' H9 \4 I) k
; G& w A a" k
//Method - 1 N=100000 247s ( y2 O |5 G5 a) O
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 Y9 W7 g+ a. O+ S7 N0 Z
5 n, Q$ n+ |' O2 b: Z, i, A
//Method - 2 N=100000 237s
6 p7 ~4 l- v; ]2 R; N /*
3 Z; x9 c% ?+ I4 R3 C4 f2 ] for (int jj = 0; jj < N ; jj++)
4 } ?( ]* L" f {
/ Q2 _; P; i, s% b0 U1 B fresult += vec1[jj] * vec2[jj];
, {" T r2 J% i- ?# } }
" l, s6 {% k9 i1 ~& [& d: X */) O/ b ~' d. ~
1 Z8 @7 p W' [& s //Method - 3 N=100000 204s
! \9 ~) f; c# B% M /*+ L( {( B; w9 I& c' q8 X* Y
for (int jj = 0; jj < N; jj++)3 U4 }$ N3 r& Z1 g5 l
{
. Z# i0 Y( H! K fresult += b1[jj] * b2[jj];
7 _6 X; j! T o9 I }- \1 {3 z ^+ r2 z$ @ b
*// c' s# a( G. P, d
1 s0 D* {( B0 V/ v //Method - 4 202s# n+ W* K; O3 J2 g6 f2 ]" I# M( }
/*
1 I( N# U7 ?- ^# b ?3 _. k for (int jj = 0; jj < N; jj++)1 {. s: b8 ?8 L0 c& h* v% H
{
* I9 [: O4 @# [
) R8 a2 d" _4 l0 ` V) { n- e }
! c% `' k' F! a- R) l4 N! U; z9 Q */
: Z( O/ x2 s k$ j //comment out all methods, N=100000 202s
3 y/ a/ o* z4 k+ |* a1 { }2 Y) F# l; i5 \. R0 l) s
( k8 g" a/ ^" H, N
delete []b1;
" m+ x6 x1 |) w' N B delete []b2;
3 X4 T" O0 H6 s8 m* l% p9 M3 G |
|