TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 & q7 {4 ]' I" b2 y8 c, L
( A# o% C1 ~- W3 b0 M) {' G. ]理了理思路,重新做了一个测试。8 Y. g, }. H2 M9 E
做了两个 vector 和 两个 float *, 都长 100000& D' h7 `2 B5 m
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ h& p) p" J X& Y" b" o0 n
, E: M7 R& C6 l4 ]) x& D/ j2 o' R内循环试了4种方法,' K4 o) s6 S9 }% P. v9 d# G7 J4 J
1. 直接调用 vector inner_product 247s ' Y4 z c: r3 ~
2. vector 循环点乘累加 237s/ U. `; W1 x3 `$ [0 ?4 E
3. float * 循环点乘累加 204s" ?, f# l* \' g+ [# t
4. 空循环 100000 次 202s/ s6 ~# \2 D) _% v9 |
5 t& L5 E# X# n% n ^不做内循环 200s2 h% j+ ~# }$ k7 w0 g7 q( j
9 z. Y/ ~ N |# x8 N) L. u9 M
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 V2 F# ^! i1 l另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 d! y% S9 n+ U5 g
. P' l% o/ y3 i& j/ l至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
g7 e$ f* f" w) ^2 J2 \ o6 t; r2 G9 ^* d
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
- @3 a( x7 `/ @% e" S
7 k8 A6 |+ F- J/ Z% K std::vector < float > vec1(N);/ B; t# g- y$ D0 x: {
std::vector < float > vec2(N);
/ ^* \5 F. F+ w$ X2 {* S4 R float* b1 = new float[N];
( V" Y/ _/ V: y# I" z9 v4 H- a2 v float* b2 = new float[N];
, e7 z8 o) k6 W; v" |' X8 t, ^
% h, @" M( P9 d0 V for (int j = 0; j < 6000; j++)
3 `; X% G) q. F* S {
# E* m/ y, X( r7 [) G( t std::generate(vec1.begin(), vec1.end(), []() {
& X* w& I$ s* w+ a# \5 o return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ D% T% u, ^$ Q+ h });% x: x+ @9 {- k7 X5 [+ }' e
! y7 m. Y4 C7 y o9 y$ p5 g" {, @ std::generate(vec2.begin(), vec2.end(), []() {9 h4 D: f3 G# K& b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
) I) Z4 D+ R+ M. M* o* ?, x });* E# p; ], g5 o
, g5 F7 ]3 ~; J0 b- K for (size_t jj = 0; jj < vec1.size(); jj++)
6 T; C: j+ C* p5 z- \: b5 W {
3 t4 S% f4 X6 j b1[jj] = vec1[jj];) ]2 T8 u7 Q5 H* A
}
" y1 Q. w6 ?" `" k8 H2 D! b2 ^; K9 A, h: ^( L
for (size_t jj = 0; jj < vec2.size(); jj++)6 o% c5 v9 U9 b; j; m1 i
{/ [8 ~- q9 L4 `7 H2 @
b2[jj] = vec2[jj];
0 u# b# L, S0 `0 w. z/ u1 o$ a* L }/ J; y, |% p5 F2 N( i
" @* f8 o. m: Y2 J8 V3 @1 @
//Method - 1 N=100000 247s 4 D( x- O8 \% e: {
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);( A# H ~: ?" u% v# @
/ C- I: V' D1 F4 q R9 n4 x! \* ?
//Method - 2 N=100000 237s
( N" a$ a" Q7 s, ]: v3 e /*
) X1 {* m ^5 W* M7 S& ~4 b( _( V for (int jj = 0; jj < N ; jj++)$ z. l/ }# z. m
{0 _( p o+ B' r7 H [- B, K
fresult += vec1[jj] * vec2[jj];
: f: k* a( w7 ]2 P }4 x5 j5 ]- [. r
*/ R& ]3 i" S: |3 V' b2 M2 ?
/ v# P; p9 F1 I$ C6 f+ v1 C
//Method - 3 N=100000 204s$ T2 s' G" x" |) H# l( {- C4 \8 i
/*
3 ~: b M; j- { for (int jj = 0; jj < N; jj++)+ g2 p% A1 o& u t
{) y" @( a( O8 E; E! p
fresult += b1[jj] * b2[jj];
8 |! N" C4 K8 ~ U" r3 E; `# u9 k. ? }
9 K4 M2 n: _+ A* `" S1 ^6 H1 x */
! C5 W. m. a; Q. X7 m: V
) y/ L: J! t: j+ Y) T; o) _ //Method - 4 202s
' N; B( r; Z" \ /*
) o% I: F R% g- u- _* m( Z6 y$ A for (int jj = 0; jj < N; jj++). U8 a. Y/ P: l# x. t
{
2 T3 r. H3 V* |3 ?
; E- e/ b8 c8 p# } }: N! D: B, o) U# D% W9 i
*/+ z. u2 k; K- I% Y0 Q; a: ?0 n
//comment out all methods, N=100000 202s # B% C" l4 _5 A, I1 n
}
! D1 o. W1 k8 _' [# \) S* q
7 f7 X5 @( A" }/ j: u delete []b1;
9 ^ P- }% O9 t- y4 A5 f# f delete []b2; . ^" x' }" n! Q0 N) t G3 _
|
|