TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 K& O8 b5 ~. c* p( c
! T3 c. T7 e2 c* a* I& s
理了理思路,重新做了一个测试。: h+ e4 Q: G- X: D7 f0 R+ ~3 Y2 ^
做了两个 vector 和 两个 float *, 都长 100000
- O/ f1 V4 ~. ]! f8 x, W2 g ~( p, L外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.% a! }! _; A* m& B
R- ~* G) K5 C5 G8 r内循环试了4种方法,+ X8 a3 L5 n& d$ e; N
1. 直接调用 vector inner_product 247s # K( K7 ~! l9 f
2. vector 循环点乘累加 237s. Y4 Z) [. @( h' k! z9 d$ k0 i% W4 |
3. float * 循环点乘累加 204s
& {6 P1 P, m+ J# p4 Y' s4. 空循环 100000 次 202s
6 _2 [1 J, R+ V2 _' I4 y5 z( ^+ |5 F2 O5 W8 K& D; o
不做内循环 200s
) a( t7 A9 r+ {/ y( D
6 J6 m; o! C5 x+ d8 H你昨天说的对,内循环本身占比是很小的,大头在其他处理。! C/ A; j. ?% f+ M( N
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# K K6 C% \) r! I- w
* a! u; u- c; }/ ]9 u1 s; a( P9 w
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" ?3 `* `0 }! v
6 w; `2 }5 x. g3 y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
( _# A/ [5 D4 `+ i# q' w; ^/ @
8 E0 `! ~" N9 F1 ]# j1 d! q+ e; G std::vector < float > vec1(N);
[; K) P$ e, @7 e std::vector < float > vec2(N);
2 K" V/ ~$ q- E. _. a float* b1 = new float[N];$ N9 E. |, G( h& Q o& X o
float* b2 = new float[N];! P6 N4 x- O' D9 T
3 x3 A, t( e- B% D
for (int j = 0; j < 6000; j++)- _1 N. J3 K9 v% s1 X
{
, k9 z3 @6 P8 ]- `7 m* x+ B! O std::generate(vec1.begin(), vec1.end(), []() {
$ x; F# H0 J( ?; t5 o' b, Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( G! V* r [ D3 v7 b: }. B. F1 X6 P });4 g3 K. Q) t( z3 m) n
0 j9 x( b$ e9 v
std::generate(vec2.begin(), vec2.end(), []() {# K6 Y, j" N6 T2 p6 T x3 [1 L: o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
* l' u( P1 \. u u });
2 E9 G( _# E' G6 j+ ?8 Y: }3 Y3 B
; W0 k5 V* n, }) x4 `% C) A for (size_t jj = 0; jj < vec1.size(); jj++)
6 Z; N9 \+ _ p' L {2 C* u: n' B1 H9 o L2 K
b1[jj] = vec1[jj];& a ~ M6 Q# @1 P! b
}8 c! O1 t! D. T' e8 k" Q$ A9 D
' P! k4 w I1 d; j for (size_t jj = 0; jj < vec2.size(); jj++)7 E9 G7 i* t% `$ \3 t1 F2 [
{3 N8 B0 o# }6 l/ l/ ^' O
b2[jj] = vec2[jj];& |9 G9 \& T4 `( w# R) b
}
5 M6 l0 T- a0 T
: W8 G8 |7 L4 f- N& F6 H: y' G //Method - 1 N=100000 247s
! I& @! S; k7 `& S# H3 O; d. o //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# Y4 | [5 M3 P! T( r5 p0 Z
; C' q2 [0 t6 T9 F6 Y$ K- `
//Method - 2 N=100000 237s
6 t# C. p4 J* d8 P4 T /*" |. i. c; L' w d& ^: |
for (int jj = 0; jj < N ; jj++)
. k( [: Z5 q! h6 P! _& L6 y9 ?* _ {
3 s) v9 _ Y0 L7 r fresult += vec1[jj] * vec2[jj];% C! B6 b6 C* F! }
}
+ ]" E7 U* ?! n) x( @ */1 `" W* J. A; E& G6 v: p
4 q. Z+ W; _7 K% E" F" J //Method - 3 N=100000 204s
! H% {$ b2 |, o5 A( t6 M /*2 V7 \. ] a- h f1 f! n( i& \' M
for (int jj = 0; jj < N; jj++)
. x% P( E# d, G2 `5 v; f% ^ {
! V5 G% u$ e( c fresult += b1[jj] * b2[jj];7 k0 T* P0 d7 w+ L
} m8 y* _. k' t+ O" W! {+ s
*/
1 c( q$ x- |* z, k( N1 o' ~
: F4 C% a# B8 ]' v //Method - 4 202s& y' H8 D8 C4 ?3 ~ Z
/*
1 T9 q1 x$ u; f( f6 Q+ @; W/ x; ~ for (int jj = 0; jj < N; jj++)
) w5 m' O! I3 z6 K! t5 | {
: E4 _1 Z# n: J! c4 E
7 M9 t6 O& u: O s% O; E }
4 `$ o; t& |3 m3 T* z+ z: c0 w */
) B' r+ R; c# ]. Q c& A2 {, p //comment out all methods, N=100000 202s
2 Q% |3 D+ E$ m! \4 u1 a* [ }
2 v- c* h) ?8 E& C) o3 `+ P0 j5 C8 r/ h* |
delete []b1; P$ ~; m! ?. I
delete []b2;
- a3 ^* m7 S, V, Q2 | |
|