TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * t2 S1 f" O2 Q+ M# f& _
0 C* B; [9 q9 g2 J$ D
理了理思路,重新做了一个测试。8 h' K, q: j% y- n0 i
做了两个 vector 和 两个 float *, 都长 100000* i6 _* x6 a" k8 W4 l2 W- |
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 d) g, I2 @% V* u+ _. t( }: a% B+ V6 V
内循环试了4种方法,5 M/ k5 q& c: [% _/ o7 m' @
1. 直接调用 vector inner_product 247s
; O" N: O* X+ W2. vector 循环点乘累加 237s9 A: Y0 `* t1 v0 a1 w* S9 A: A
3. float * 循环点乘累加 204s
, S. U2 ~% A7 W+ U! ^4. 空循环 100000 次 202s% T) p% \- G; n
{! c$ {% X* x
不做内循环 200s
! f% V: Y; w% T/ G! q3 {; g+ x1 d2 L+ t5 n' g5 r9 d" R5 a7 r4 [0 |+ y) B
你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 X! E8 \4 V- N' T
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
1 y9 b3 p% p4 E6 z3 X# ?& V) M" `' r \* l% l6 a% t* e$ \ p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). Z0 `. }8 G. O* B& o( m
: x9 I+ k7 k. t! x7 W. \(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 s- Q- ?6 h7 [& _
" r. Y" y, H- P; K/ `1 U1 y( Q std::vector < float > vec1(N);
! b' E& p Q X' h. L( [& i2 Q. y# y std::vector < float > vec2(N);2 N' R5 i0 ?+ e( }. u q
float* b1 = new float[N];
4 m7 e$ {4 I1 S) j+ p( Z float* b2 = new float[N];
. B( d, R) h" A- l+ q; w: a$ w0 F+ ^8 E; t0 v8 C, Q
for (int j = 0; j < 6000; j++)
2 E1 r q. l3 w# Q; [& A# ^ {
$ W6 R) b |/ l std::generate(vec1.begin(), vec1.end(), []() {
$ B! }) o1 O6 i8 P+ j( B1 L. J return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
& ?" l9 e* }5 R });/ B: e6 a- r, t V' J
4 C/ u! o3 f: U7 o: M+ S0 Z4 J. G std::generate(vec2.begin(), vec2.end(), []() {
; W4 G" U$ u2 O0 O8 y! f l return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
* r$ f: H7 F1 T8 D8 D# M });
, _/ U! b+ d- L; a$ o9 j' p' f( i' m) h4 Q4 ?
for (size_t jj = 0; jj < vec1.size(); jj++)
% i2 _- b1 _# V* { {
5 [" u! a7 o; M* j, T7 W" `& L b1[jj] = vec1[jj];4 y! P4 z7 w8 l" t% O( t& R# W
}7 {* a7 x- T4 f1 m. d7 N
+ }1 z6 b0 U6 u( k M. c- i- W for (size_t jj = 0; jj < vec2.size(); jj++)0 K2 M1 u3 `8 W
{
+ z% F7 T! ^: E$ } w% j; n b2[jj] = vec2[jj];) o& z% `0 ?& N: t0 e8 v
}9 T+ X) o+ s" d1 {
8 L" ~1 U5 D& W. g* s4 [
//Method - 1 N=100000 247s ) p7 p, V( A5 w! k+ L, ^' O1 Q
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( W/ O, b$ L) `( ?* S0 \/ A8 q3 q
# w# S, M, X, U" `3 S5 } //Method - 2 N=100000 237s
1 c5 ^- g7 V2 C' n! w3 m- |3 s /*" g9 o2 J" S- u$ M$ V8 R1 c' U
for (int jj = 0; jj < N ; jj++)* I0 `" \; N7 B$ J6 A) S% f
{9 V. v# _, t/ A H$ ~! F) b
fresult += vec1[jj] * vec2[jj];- @' `) V- P. ]# h& l A
}
" V4 a1 Y6 W0 A9 s* R */! l$ ^. [! p/ Y2 d
( H( N! w8 P* s //Method - 3 N=100000 204s5 J8 @/ p% ]+ f( s5 {; m+ s
/*! v8 w: C) E$ e
for (int jj = 0; jj < N; jj++)
) p. M M, h) m" g& j6 |5 d {7 q) p0 X' s5 Y+ H/ f Y, S6 L8 }: p
fresult += b1[jj] * b2[jj];6 a4 e6 Y% r: m: C- N5 A% q/ Z# H. X/ u
}, ?& i1 }3 q! y a
*/) y7 B' x1 g; M. q$ j V
2 |5 E9 j" b1 U/ ~0 I4 d //Method - 4 202s
2 |4 u' c1 _5 [' o* v /*
$ z) m# ~( l! l# [ for (int jj = 0; jj < N; jj++)
+ f! `1 I( e% i! K9 \ {; R' g0 M4 }( {2 K2 _- o" z; i6 J
5 v. |9 G' @. a, k: H }$ D& H8 k3 `% {* F! {
*/8 o6 A3 m8 M: [1 F. e
//comment out all methods, N=100000 202s
4 G8 k0 c# E8 n% q( s }2 g/ j" J" [% @- M& ?
8 `+ N" N2 H4 v delete []b1;
) ~) a1 ~! ?; l! B: b) Q& E delete []b2; , t5 `: T/ O9 J5 Y! Q( v3 p4 n
|
|