TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 Y, T, y- D: z8 V3 K0 T- P, v
8 l) G7 |( m. {6 z4 S3 G理了理思路,重新做了一个测试。
: N- D: Y5 D4 O) U做了两个 vector 和 两个 float *, 都长 100000
2 h9 f9 B9 {3 Z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.! E+ D3 Q4 j0 M) @$ n `3 W
e, P7 y r7 ~. t ?内循环试了4种方法,8 H& o. C1 ^# [/ O; D, Q
1. 直接调用 vector inner_product 247s " v. g1 A6 Q4 C* |6 `' S" f
2. vector 循环点乘累加 237s( q1 ~! ]* F7 h
3. float * 循环点乘累加 204s
8 k& `8 A- r/ y- d1 H4 F4. 空循环 100000 次 202s" t' b. r* z$ g2 F9 P7 y
Q% K5 }5 W! f% z6 e* b
不做内循环 200s
1 |* H k+ u1 l' H
- n% z" G7 @/ `你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, x, j- R6 w! ~) ~$ I9 _另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; r5 p2 g, S! C' W
% n& F, g5 w# G9 b- F) q- c# {; p) `/ k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# d! m; b/ d% l" k9 m
: o' b8 J" `1 v% q( I. N1 b/ |' E% G
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
# s' ^* S2 c( I" Y* L$ `+ S* [9 a% e
std::vector < float > vec1(N);
+ H* Y0 C+ ~5 a' C+ z z std::vector < float > vec2(N);
3 m7 {6 E6 t- ~ float* b1 = new float[N];3 s& @# ?. A c5 U0 F; z' E
float* b2 = new float[N];1 l# D6 x# E7 N0 K% v
6 S# J7 ?( L- |; j for (int j = 0; j < 6000; j++)4 ~" s! l x/ u: B: Q H
{: }6 w+ ?; }6 T5 j6 w4 G
std::generate(vec1.begin(), vec1.end(), []() {
( s0 I$ v5 B; f2 v5 @$ Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
9 Y+ J [! e! d. w0 T+ I1 T E, \ });
* \4 Q) E1 r3 s5 X! M% w+ `# J
+ o" Y+ ^$ d+ v: s. W& b std::generate(vec2.begin(), vec2.end(), []() {3 J2 B* t5 F6 \" {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
: I# h+ }4 e" P9 q5 f6 ^3 c });& Z7 c* ^2 \# Z( S, g( f2 {
% P# p) ^# v# i* f
for (size_t jj = 0; jj < vec1.size(); jj++)
. M; }; v8 X# w3 B {
6 _; ]% Z9 A/ Z0 A$ C! V. L# P b1[jj] = vec1[jj];
: m" i$ |7 ~: E' \1 I) E }
9 k5 f: g) {: X: L% c" |* X9 r; H6 O( H8 j" V# o' W0 R. T
for (size_t jj = 0; jj < vec2.size(); jj++)
# H) Y+ Y; e* W0 y/ t* @1 @ {- Z& H$ f5 Q6 U
b2[jj] = vec2[jj];
5 m! V& b! S$ g; B }
1 d& o, E( V! d: @! U, i& V
5 V8 {6 d" b3 U3 W //Method - 1 N=100000 247s . }& d. R: {- ]7 v+ Y0 e
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 v( A# N# c o5 s
) ^2 |( G, D5 f: g' k
//Method - 2 N=100000 237s) t( F* k! E; X" M9 @' ?9 b' L7 a
/*+ P: N# T. f9 k/ v# `" J* O: C* |4 X* z
for (int jj = 0; jj < N ; jj++)+ _" `/ M o1 v
{
, t# x! o0 i, h9 ] fresult += vec1[jj] * vec2[jj];. [% O# d, q8 L
}
! `! E5 w; I7 A9 F( h' p" B3 D */, L- \' x9 u1 V4 D2 S" k6 e: @
$ O& A- o- `0 z0 X //Method - 3 N=100000 204s
7 @1 S$ n( S! p" Y, [. W2 D1 t /*
3 w: x) c, |/ h9 p+ n: K for (int jj = 0; jj < N; jj++)
0 e4 A( {2 F* f( w) s, q4 B& x: h {
* N% d! V; N, h% h. j: | fresult += b1[jj] * b2[jj];3 N4 G) ^" A1 I' ^+ d4 S) D& F4 U( A
}% s0 e2 @& f- q7 f/ P
*/, K: h: u( V# C# R6 ^9 \
; ^& v! U4 E6 E+ K0 G
//Method - 4 202s, a: Y3 T$ m4 ~; ^% ]7 |
/*
/ p/ ^+ Y$ v2 Y2 _ for (int jj = 0; jj < N; jj++)
' L. E+ d1 i/ w& m {$ B r7 d+ w; {% r
5 |* |4 u/ b1 y
}) V& F) u0 \$ f _
*/
3 R; T2 u( S$ A( L% M6 K8 l //comment out all methods, N=100000 202s ( L) y1 u+ @2 L& h& Z7 \
}9 s6 b( }5 l5 b4 P; ?* ]
% j2 z3 v* z. E
delete []b1;7 v' k. T0 e( O9 Q9 E6 M3 P/ H
delete []b2;
$ l. K9 L* K7 J! l* C2 y# L |
|