TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
& n4 F6 [+ I% a
' Q |! R ~) \( Y/ q: y理了理思路,重新做了一个测试。
8 j0 m0 E9 b, r; n2 A& C做了两个 vector 和 两个 float *, 都长 1000007 e4 y/ g* O" V, ]$ a+ o2 T
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 M8 i1 K" z& ?2 N- r; q! [! k& V' ?" ~4 a' J. K
内循环试了4种方法,5 l; A0 m1 A% ?+ A
1. 直接调用 vector inner_product 247s 6 j5 h) A1 ?5 E' }0 l
2. vector 循环点乘累加 237s
; L/ p c3 _& }+ g2 I( M. M3. float * 循环点乘累加 204s
% {- S) n$ u* D) [! G' q4. 空循环 100000 次 202s, Z: c) O" \' ? o
; v2 a, t, z) w O* N% r- j* O |
不做内循环 200s
$ u& O, t9 w/ I: Y
! I8 L3 R0 i3 s. B7 Y6 T你昨天说的对,内循环本身占比是很小的,大头在其他处理。; T* r+ M% L7 W2 L5 y+ C' E; P
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
* i# }. A, s0 A, Z, ^$ d8 A
; G Y6 l% A1 L5 f' x* N2 x至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
6 P+ b( y& e! c" _. O3 z0 E' U
9 _3 y2 J1 P7 K(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). l5 U1 E* q1 C
; ^3 k d; S1 p. ^( ^ ?4 Y std::vector < float > vec1(N);
' r! ^% |: P. K' m- ^9 b std::vector < float > vec2(N);
- s8 w' W) k2 H float* b1 = new float[N];
" ~0 I$ z) V( ?( D/ n float* b2 = new float[N];( P8 G1 k$ q' J. K4 ^: v; C- f
' ]& v% P+ g3 C9 ?8 i
for (int j = 0; j < 6000; j++)+ n2 R% v% [7 B+ f. z
{
n3 k! J' e: I# Y2 |- u9 q std::generate(vec1.begin(), vec1.end(), []() {
N) H4 E* p# z% q# z! A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
5 h6 `5 c* H. k$ J0 `' H2 w });0 u I; D9 t3 x7 X' i
' ~; U! x j+ _# P5 p9 G6 L std::generate(vec2.begin(), vec2.end(), []() {
8 U9 w, S- U* O. ^ }0 g return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;/ c) @# Q* `/ g3 k- w
});
/ ^9 O" N9 }2 T2 F% z1 r- s
7 Y. x0 d0 Q: g( W) F7 O, S3 }2 L for (size_t jj = 0; jj < vec1.size(); jj++)
- K8 Q/ h5 z# X {5 o6 J( N1 A* o# @0 F
b1[jj] = vec1[jj];! u) p8 |" l# A; q- q: X: t( _& |
}
6 k. m8 ?1 L D y; L: H. |* |0 c" L* F7 f) o! E9 ?8 v1 T0 |
for (size_t jj = 0; jj < vec2.size(); jj++)' o t4 p0 Y. F' J f7 Y. M
{* E# q2 v) N4 W$ ^
b2[jj] = vec2[jj];! V5 C p, c. c/ s8 x% N
}
, q- S2 y, [8 q
1 r7 h: o! Y R //Method - 1 N=100000 247s
! R! v; N. _ x //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! `- `6 H- q# k2 c: H
% n$ s/ Y) I' h6 {4 h% \0 l' C9 o
//Method - 2 N=100000 237s6 h+ }" M* X0 Y1 @% V
/*
. R n8 f; W/ M( |- J, R for (int jj = 0; jj < N ; jj++)
# N9 L3 h5 J0 K/ `" p {
4 p! a' s1 \9 A8 ~5 \ fresult += vec1[jj] * vec2[jj];7 [; w7 C& ^% |" _) N6 n4 @/ W
}: G9 ]6 x) c3 N0 i1 n
*/- K% n- C/ B! F: L1 `! U/ m
2 v) l! B6 I. R( V- r5 |6 x //Method - 3 N=100000 204s
9 e+ ~/ m# ]' u /*6 b: d0 m; e. `( {
for (int jj = 0; jj < N; jj++)
7 i% l: |1 N# u3 N5 m7 |: j) y2 M {
, ?% ~* U& `+ w8 |# ?1 B fresult += b1[jj] * b2[jj];+ T0 w6 K* ^7 l( F2 i
}
. A! @" X1 k1 B% g: ~ */- t4 u5 l$ w, g$ L" _
J: p5 t. }* V- {
//Method - 4 202s% v+ T3 w; N5 {8 R& ^3 A/ x
/*
- u' N% R* `1 ~5 l2 ?. v c for (int jj = 0; jj < N; jj++). `* Y9 @: {' C
{1 f" Q v" y. ]6 \* k. \% d% h- E1 X
+ l4 U3 {5 J7 Q( k }
. l2 P5 y: P' G! Y r& C */8 a' K1 E$ w3 M2 J+ a
//comment out all methods, N=100000 202s + A# J% q4 u1 q& p) H/ k, q4 b7 L
}1 F! ^# ?1 z: D+ k, C4 Q* v
1 c3 s# b5 r0 a9 j3 H
delete []b1;$ v, R+ G5 N5 |& R, I
delete []b2; : I5 x; K5 l ?4 s
|
|