TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
& z! D) H3 y4 z! g& ~) n
% P& C( Q$ {& Y- L4 b+ Q6 F5 I理了理思路,重新做了一个测试。
8 \% U: |6 p; L5 @' ?4 n: H, m做了两个 vector 和 两个 float *, 都长 100000' s# W7 }1 [/ P7 Q; v1 q. D$ E
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 G* l8 f/ d1 `2 a7 K4 [" H, J9 p) j; F, v8 ^
内循环试了4种方法,. y' E- l4 y, R" I& G6 f" U
1. 直接调用 vector inner_product 247s & }. }4 W2 v W C
2. vector 循环点乘累加 237s! X _9 G9 f" v# E
3. float * 循环点乘累加 204s( w; J: ~, X; l! Y8 A# s4 Q
4. 空循环 100000 次 202s
' k. f e' q" b2 l r( q
& |# u0 I8 |/ h" e2 K, Z6 Y0 {4 ~不做内循环 200s. B& w/ D( |0 o# R
3 P9 m% _# ~4 m/ H0 X
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
: ?" ^$ ^9 o/ r8 u4 _另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。' q3 g: ^1 k4 U; U8 l( a
' I. J- o& Q+ N9 a, Q) j" O至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) Y) O- q! G/ v, D# @, z' e& d. e7 w2 W
$ e9 N: Q9 D3 k0 V* D. s! B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! [% x/ ^6 F0 b9 N
$ W- `) x3 x7 I5 F. {% ] std::vector < float > vec1(N);5 I+ ?1 F2 L' u- \2 i) f
std::vector < float > vec2(N);$ O! W7 r" Q/ E/ j
float* b1 = new float[N];
9 |& p( T$ G3 b( [! V0 p float* b2 = new float[N];7 L% ~' F- H: R+ b
/ d: G2 h; t, y5 b for (int j = 0; j < 6000; j++)
& ]" I5 H& z* s: ^( b* x5 j {8 t" E; ^- U0 l8 H- V% p2 u
std::generate(vec1.begin(), vec1.end(), []() {
7 Y& a/ j M# |! ~5 R2 J' ?; t! s% V9 L return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
! L$ v5 G' }! C+ U4 i- l5 o });) W; W9 |, J, e" s
% u- {; ^ R6 \0 _- U std::generate(vec2.begin(), vec2.end(), []() {
( T) \# V7 K% } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 V; D9 G) {6 v B* J7 T( ~
});9 d) |+ `, g& f
5 M# A5 a* Y; I: r2 f2 W! ?5 s for (size_t jj = 0; jj < vec1.size(); jj++)
6 h5 Y6 @* A. o# s ]1 `8 [* K) A {8 C- p& r: a9 Y2 U7 i$ D
b1[jj] = vec1[jj];2 _% Y3 ~7 ?( } \9 V' Y, K
}/ N3 Y0 S" l9 F! `2 e2 i& @
0 M7 j. l" T; X+ b9 d% X for (size_t jj = 0; jj < vec2.size(); jj++): _: f% N! N' w$ ]& D& J
{: s1 M/ o* J" h! b
b2[jj] = vec2[jj];
3 x- k/ h3 K. J# F9 Z }
% M$ n% m$ ?2 u9 z( ]2 }- u8 ^, [5 |* D+ H; k
//Method - 1 N=100000 247s
+ U I9 C+ B; }% G- H# G2 Q1 ` //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 m& v! B3 {- @4 A. Z
" E2 G3 E1 [. ]' i
//Method - 2 N=100000 237s# L$ p7 O# |7 _: ^+ F, m; |! I; c
/*
, n+ }) i6 e+ R0 D3 S+ }, c for (int jj = 0; jj < N ; jj++)
4 b* s# G! i5 w1 F, e) G {5 V8 G; H6 p6 g. P
fresult += vec1[jj] * vec2[jj];) m7 _; z( q; w w
}
3 x% V/ B+ q; w- Z& K( { */
: n8 d" i3 f0 @& y) U. w/ `5 D , L% e5 Q" S+ S* q, A `- ?8 B- S
//Method - 3 N=100000 204s& ?* _9 V4 v, c8 \+ F
/*! O! Z, d G# Z
for (int jj = 0; jj < N; jj++)
. E' r' i/ ^0 @1 ] {/ a& J/ I# S0 _6 i$ g' c( V
fresult += b1[jj] * b2[jj];* q- ?$ Q$ X& M7 I, F) i
}; x0 R4 Z( q+ D& s9 I/ f8 [! K/ s
*/ S9 y6 {8 v( r. M3 e
$ H; x/ R3 J* N0 j //Method - 4 202s
_4 r3 ]9 @9 ~+ p2 I% w /*" @( c5 h9 O- R& k
for (int jj = 0; jj < N; jj++)$ g8 O, Y6 v. z2 a4 r5 j
{
; o8 \! F$ n% U- c3 l% L ; ^6 b9 ?! G, t$ Q% k
}
9 j& W6 j) f) o/ ^- z, C( ~ */2 E/ g8 Q8 U8 Y5 n: _* u2 y3 C0 C
//comment out all methods, N=100000 202s
# g3 W. b( o: k" h) F" r' V }
: v5 [. s `# _; K, v/ ?
8 Y. _) M, T- G5 t delete []b1;
, ^9 C, a" _: u8 T: h( ` delete []b2; 6 u2 K/ V& J. J
|
|