TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 E6 M& T# l. l0 H, S3 ~+ j$ x! h
4 i$ h& q8 [7 V理了理思路,重新做了一个测试。, v4 {0 T8 G; p# [
做了两个 vector 和 两个 float *, 都长 100000
/ n! C( E, a8 ^- r) \$ C外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 W& C& h" a2 m0 u( i& P+ B: W8 ~6 h% H1 J
内循环试了4种方法,
/ W" X' l! p/ S8 n+ E! H# g1 X1. 直接调用 vector inner_product 247s 6 s* i9 ^: f* r2 j5 j
2. vector 循环点乘累加 237s
9 Z/ l4 Y6 Y1 C$ z0 o8 y3. float * 循环点乘累加 204s) A1 p4 V- R& e8 j
4. 空循环 100000 次 202s
1 j" I4 b, C) E9 k" o
7 w# U% V; ~3 |+ j不做内循环 200s
1 F6 r1 u& u8 E' Q% ~
4 n' r/ I- i8 Z' y: a) h你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ \) C1 r; @ D/ w! N5 E
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 L; e# L! D* `) I/ Q2 u, S5 e2 c6 X
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 W9 @4 Z* f; L
+ m0 V% |2 K8 S8 Q% j! V(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)4 \5 B. f" P, h9 ?' H: ~
* V% R) t' G* P8 @ std::vector < float > vec1(N);
0 a7 l$ w2 U6 X' f std::vector < float > vec2(N);1 w) Q( o+ [& I
float* b1 = new float[N];
" r6 v8 e, Q1 I* `+ G7 |% N float* b2 = new float[N];, g/ x7 {. N* e$ {; i3 e& m
2 Z' C+ K0 F T2 x for (int j = 0; j < 6000; j++)) N, I: R4 C" P8 X
{0 a4 o" I) t' j
std::generate(vec1.begin(), vec1.end(), []() {
4 o, R1 v" h3 p- u4 I9 q; Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 l* [! S1 f6 ]& u% C' V: b! d
});/ W2 K- w }7 e5 L' q7 K4 ~1 L
& O+ l" M: _1 N
std::generate(vec2.begin(), vec2.end(), []() {
- E2 z& c6 N# r& A5 s# X return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' U' P/ ?' I( D9 U
});
$ N0 ~% q$ o o1 J; c& ^! u, ?. `1 L
for (size_t jj = 0; jj < vec1.size(); jj++)
: X: H7 ~2 p6 t( A a {% E* m. p7 I! z/ C7 b* O: M9 j
b1[jj] = vec1[jj];" ?5 O' r. J3 E" g/ A
}6 z5 \( G. S u' R, G
2 \" S$ ?3 b& W0 Z: g# Q
for (size_t jj = 0; jj < vec2.size(); jj++)4 p% \7 C6 m' Y) t _4 |
{3 z) |; z0 d! g8 i" Q
b2[jj] = vec2[jj];6 N+ Y% V0 r% S' H( k, z" t) t
}& u/ Z- i: l/ q
9 u( ]! t, N% [/ n$ p6 n+ a! ~% p
//Method - 1 N=100000 247s ' t- D2 F! Y- m% c! p5 q# z
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 Y6 [" B& e: N/ X8 y
% h5 l( Y) F, U* @9 y% O //Method - 2 N=100000 237s2 f# D. G8 g* ~# H( y8 S4 c
/*
# u. `2 [) U$ T for (int jj = 0; jj < N ; jj++). f" w1 G `+ ?0 q+ Z
{
* M$ R3 N4 U, a/ u' D( h fresult += vec1[jj] * vec2[jj];
7 [: N- f7 t, Q9 e2 D+ i* { }$ E0 X$ ]/ \! {1 _) Y+ I+ S& j1 ^
*/0 E/ A: ?1 r \ o/ L
% S6 k7 I6 [' f2 \( \ //Method - 3 N=100000 204s
2 f l, |% j7 u1 r$ l8 P. p /*
% e, B8 ~0 ]# o0 Q' J8 |+ Q! F for (int jj = 0; jj < N; jj++)
* X6 ]. }' {! Q! J8 j {2 r9 W) x, V! J# V( r& i
fresult += b1[jj] * b2[jj]; v* \# ^! E* ?& d. P
}( }8 ^1 ?6 Z: \! ?( C* U/ M
*/7 @- @. K0 q4 i& E7 D
0 Z" x" ~& ]/ w# C8 E2 t
//Method - 4 202s
+ r4 q1 h# u$ Y i0 e /*
6 M, V' I: D2 I+ ^ for (int jj = 0; jj < N; jj++)
) G4 M! ^: C7 x! n$ e; W {
7 s, A9 v* o1 Z) k- E
$ @' ^3 S! C- U m2 p: N }+ }4 A7 m( k5 N6 n: }4 s
*/
; r5 I1 v1 V3 R- e% v. d! m- O //comment out all methods, N=100000 202s
1 @+ F t, N9 n$ i- D' D }6 l7 x1 H6 D2 ?7 n
6 W f% y4 S( e delete []b1;+ D; D+ ~! K- `5 F/ W* H- a, [
delete []b2; , ]% H$ E i4 |3 ^: A) p* f
|
|