TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 n" ^; P: i" X* P, r
9 R: c$ ]$ M7 _! _6 E2 t: ]
理了理思路,重新做了一个测试。
% E1 {4 F+ l) G5 N做了两个 vector 和 两个 float *, 都长 100000
! A; L3 z7 ^' n' y" N* z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
$ c& B: t4 _" R/ i
7 W1 u T& W! T; W4 l内循环试了4种方法,
3 D& C' \5 h8 }6 o- d% i: G6 @2 \1. 直接调用 vector inner_product 247s
% }$ J# J, f; {0 J# D# w2. vector 循环点乘累加 237s! A6 \9 q4 p j! }, ~
3. float * 循环点乘累加 204s" G" K' E) d( B1 v& a5 Y+ g
4. 空循环 100000 次 202s
( A7 O7 I6 @& h( D& w! q( l) b n. v; c$ H1 J
不做内循环 200s& P( @$ w0 V& h8 ?! f0 p
% f" A* n( g3 N1 |% u! _你昨天说的对,内循环本身占比是很小的,大头在其他处理。
) C# v D# i% o另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( v. Q! Y3 {+ U7 H9 P, N
. {. [# q5 i4 L4 M
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) g1 G* N5 Q0 P! X4 N# x: m
& ^( l/ K- O1 ~ i; r
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 f/ A) S0 K: L$ E a6 f
( F& m2 H& w. A/ l( n std::vector < float > vec1(N);0 k8 ^) r$ F0 Q4 r6 x
std::vector < float > vec2(N);
9 I: J" y: R3 T+ d) @0 r float* b1 = new float[N];
1 n( U$ a. X9 ~8 m float* b2 = new float[N];
. ~% d3 p# u% o0 C
/ |6 N* X( O) \2 n2 W( T" p for (int j = 0; j < 6000; j++)5 j8 R, D3 k# B, @6 {9 L
{
) e/ a- J& a* ~8 C i K% ?8 j( l) n std::generate(vec1.begin(), vec1.end(), []() {- t! W4 Z6 S; n9 E/ m( L' O$ z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 M) v9 _$ y' ?
});+ s. z. U. N; G8 R' [
: o! J( x7 t; }2 z2 h5 i
std::generate(vec2.begin(), vec2.end(), []() {9 u6 ]0 R: Q0 ?
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
( ~. f* u2 c9 R3 e) L });
" _7 s1 R2 V; ~. y3 I' b* q, F4 {
" Z' w+ G( H/ X1 `8 _$ E for (size_t jj = 0; jj < vec1.size(); jj++)' M: R7 m: s4 [0 p
{1 S- P8 j# t( D4 C0 I
b1[jj] = vec1[jj];! M, o; Z+ D5 l7 H% v# `
}8 Z$ Q$ K" f# B! w! p
% l* t; z$ f: t5 n, w% O
for (size_t jj = 0; jj < vec2.size(); jj++)
9 E# c U( w: N3 C& z V) u1 [4 k {
- U( x) d! C6 \+ X b2[jj] = vec2[jj];9 K$ v/ K9 r: A) O
}
: e' _' T) Y4 b- f$ |
0 E0 P6 A0 }0 a# ]" U //Method - 1 N=100000 247s
6 O6 N5 y4 W& V$ C4 @; \ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ K4 }( Q. ~9 Z, G5 K, T- |4 h 3 a: Y# P7 V6 J, Z
//Method - 2 N=100000 237s
% K5 C1 L! c0 f7 d0 W% L) g: l /*
" ?8 Q9 r5 n9 Z! V7 s2 a. |6 l7 p* b for (int jj = 0; jj < N ; jj++)- ]6 H( | R2 V. V3 f! ^3 ^* _& u
{
% h; Q! }* U, `5 z7 `9 \9 H fresult += vec1[jj] * vec2[jj];
6 r" f. ]- K, @/ J! d }
$ O! y( u: U i i( k. Y% | */9 a2 V; A6 K. ?$ f# k: X
7 k( l3 v8 E: U( J //Method - 3 N=100000 204s
$ t" v2 @+ Y* Z# [: @ /*' E( n8 w; T1 n/ ~; d h- x4 }
for (int jj = 0; jj < N; jj++)7 y' N3 @9 a' v, R) ]
{
+ B9 e, N+ r3 ?- P; @5 l fresult += b1[jj] * b2[jj];
1 P: ? W8 Q h7 f }
/ B& A3 k1 I7 D# d */0 J/ i6 ]# E% q/ B
6 t% I; X1 f9 D, G! ~ //Method - 4 202s
3 I; f- b9 u: @/ { /*
% T8 j) w& @! V! F$ |% p' G$ \ for (int jj = 0; jj < N; jj++)
' a7 d$ ~2 c% r" k' g, [6 f) K/ n {3 ]% P0 n. n, ^( v9 `4 z3 U% E, B
1 J7 @$ V! @. P5 ~ ~1 ]
}3 D0 W& e. N: W" Y
*/
7 X. L: \/ W" @7 S$ N //comment out all methods, N=100000 202s
7 E( D& r7 u2 I- T5 l8 j2 l }
1 T" M8 d: ?9 ]/ l6 A% H, {( B6 }) f* w- t: i# ^8 j5 _, U. |
delete []b1;
8 F* L8 R$ Z: ]; E2 ~/ k8 v2 { delete []b2; & X6 ~# A: ~, F7 H5 j
|
|