TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' A' a2 D! D" ?6 W' j
5 N/ S; q, y! g5 i, M( c* F" }理了理思路,重新做了一个测试。4 k- \! h0 C) x% x9 W$ |
做了两个 vector 和 两个 float *, 都长 100000; `2 G0 ?: n* h/ U( b- H- ]
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 o" x0 d+ P8 }4 I
4 `. s+ F$ q( }5 ?/ W9 ?内循环试了4种方法,
6 S0 |0 R, G, j. x1. 直接调用 vector inner_product 247s ' p# f$ Y7 u& J7 v6 e& \
2. vector 循环点乘累加 237s* o ^. n3 ^; x0 E( Y
3. float * 循环点乘累加 204s
3 Y4 @, k8 ~ e% a# T$ ?' \4. 空循环 100000 次 202s; K3 Y3 u' N, {: e( n: ^
# A+ K& i5 s6 l- A
不做内循环 200s
3 ^8 h+ o- [# u; _3 ?7 v1 S7 u4 b' X, Z2 {: q7 l9 L
你昨天说的对,内循环本身占比是很小的,大头在其他处理。* \, b' I/ _! l6 v5 i9 Z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 H/ l/ K3 p- _3 c% |: d
# M& I+ B- g$ v2 U! \+ i
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
3 r8 q, S- E& x5 g7 m; W0 ^8 H, W; ?
[7 h/ |1 I) B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 w* u6 B/ Y7 P
( @$ _# \3 f7 P3 ^" W
std::vector < float > vec1(N);5 y' ]# d/ y+ J$ h/ S% f) M& B
std::vector < float > vec2(N);* F n9 z5 K2 E; b+ V
float* b1 = new float[N];
9 g1 w7 {( A/ L) a h% }8 ] float* b2 = new float[N];- t( B7 M% g: p2 ^* }
3 U0 i3 B+ m3 y for (int j = 0; j < 6000; j++)
1 i! A% f4 v. b: T9 r {; _, \% u0 p% ]* |
std::generate(vec1.begin(), vec1.end(), []() {9 W) e* Y5 G% ]7 d8 h# c
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. \( E: m' ^5 W- `8 U6 B" h });: T) t3 s( L9 x& p) H% ~% D
3 m+ r% K! l3 z. c. C0 f' f, V
std::generate(vec2.begin(), vec2.end(), []() {
! H& U+ s* {2 c, q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 R1 l' j. ^6 f3 b
});5 E+ {/ g% L2 _
# _! ?# R' r' Y: M+ C for (size_t jj = 0; jj < vec1.size(); jj++)# ?3 s& o1 S0 a: w- t+ g8 q5 Q
{
4 ^/ L* I2 Y$ y b1[jj] = vec1[jj];
% V5 d a3 M+ x6 P4 ]# L }8 n' @% n: }+ a2 o( q0 F
8 y% A% J( G- g# P$ m& |0 s
for (size_t jj = 0; jj < vec2.size(); jj++)
- z' Y! l8 Z9 V8 B {2 H8 o% I$ n B) }: F1 H8 @/ S
b2[jj] = vec2[jj];" u4 f: G% X0 N& X. Q( P
}, }: k& U6 ], ?; e. N9 B6 S' d
* e+ m" Z6 f' Z% f8 f //Method - 1 N=100000 247s * e3 G3 n( F& [
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ [1 L& H+ a! A( O ' `3 E5 r% v( A3 v6 A( G
//Method - 2 N=100000 237s. Z: X! b1 a! ^" N! @7 l
/*( M' b/ Q. O; J* B7 W4 }4 Q" E
for (int jj = 0; jj < N ; jj++)
( g5 n4 X5 w5 b @! C* z; L& _4 r9 ] {
9 Q- ^6 {& o+ M4 ]+ c% ^8 T fresult += vec1[jj] * vec2[jj];% a2 c- U% A) E" h+ J7 k
}7 n% I0 O/ A) c$ N/ p9 T9 ?* h
*/
) e' n8 N* W( P9 r
/ J; N5 _% s9 X& _2 W //Method - 3 N=100000 204s
: Z8 @# J* N" Q; I4 W1 T( s& I /*
- d% T4 _ |$ i5 o' d# m2 a for (int jj = 0; jj < N; jj++)
7 x+ t& f# u3 x( r6 P {
6 @; i- E1 R) j6 T. s& S2 ~+ y7 Z3 w fresult += b1[jj] * b2[jj];; {$ C8 s2 K% O1 ~$ c$ D
}
" T! U. r. U: K6 o( e$ U0 Y */' [ @+ ]9 M8 t) V( B. D, r) f! g6 V' s
. M- x, C0 J1 }3 @( l4 c
//Method - 4 202s
! I# ?( A# K- F /*5 C5 W* Z; B2 j1 e/ w( O8 i- L
for (int jj = 0; jj < N; jj++)
% @3 R* _" S7 y {
2 L j+ j; k& O5 A m . ~6 S2 @7 i+ w
}* F* C8 ^% M p$ L
*/. `. u7 p/ ~/ }+ W
//comment out all methods, N=100000 202s
& l. K$ B/ h' b' e. b( A( | }
: C: ?# r( k+ M( p0 C2 `! E9 D' K7 S* V4 f
delete []b1;
6 D& f$ X; c/ h% q8 Y delete []b2;
1 M/ _" D, b1 P, q% l7 w |
|