TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, ~, ?) h2 f/ c- V- S
- [3 r: l* V9 B3 u理了理思路,重新做了一个测试。 P- t$ U5 a$ } U* Z8 x# ]0 ^
做了两个 vector 和 两个 float *, 都长 100000. w- a3 I0 D/ U* G6 G; L5 ?8 c$ j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.! l" ]; A3 R, I) g
U$ ]5 ?/ F# _
内循环试了4种方法,
8 u- O4 I5 t5 D1. 直接调用 vector inner_product 247s
" U1 k, Z |4 X8 H! I4 `4 G: j( j2. vector 循环点乘累加 237s
6 t7 c9 J; a, t) E3. float * 循环点乘累加 204s
0 d6 ^: D6 p. |1 y9 }. J4. 空循环 100000 次 202s
& u8 s* g1 \3 z6 y* b' f/ Z, L3 w+ r: O7 L& Q U
不做内循环 200s
- A9 T* P/ M# _) j# g% d1 l
' ?) ~: I$ s& B你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 G- X: N$ \" a; }另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 e4 y" z6 V. Y- b" S. [* k' J. N8 P1 C1 }* Q9 J
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# G" ?* e9 O- X
$ e- ^0 e9 P+ x0 i, v
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 d( K+ o! C9 ?& G/ K
: e$ m% B, w; \6 ~ std::vector < float > vec1(N);: J; o5 T* m# }7 ]! x, |& c! q
std::vector < float > vec2(N);4 L( q0 s( F+ a7 o
float* b1 = new float[N];
: T4 a& A5 K9 d7 ~8 q0 b float* b2 = new float[N];# \1 b9 Q5 ~/ d' r4 f
. W2 N; V `2 m/ t
for (int j = 0; j < 6000; j++)
5 K" h3 Y" ], m M2 g9 Z {
$ w, ?( y6 p% E/ S std::generate(vec1.begin(), vec1.end(), []() {
2 ]4 c) M7 J( _8 |. ~2 W return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 k( o7 {8 G' v2 E1 j: j6 p7 |6 m
});
8 w; v: n: W3 x% |
7 y8 l) S8 ], B# Y- E: L- n/ @ std::generate(vec2.begin(), vec2.end(), []() {
4 o$ \7 Q% V0 P- v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 V( Q* i& C0 O' K c1 `6 w4 S
});
# B/ a5 T- F- ^2 C7 {* p( ~0 t: r* H) {
for (size_t jj = 0; jj < vec1.size(); jj++)
, i2 v7 d2 m& a' ?- D) s; u5 W1 U {
4 R" A. g j! o b1[jj] = vec1[jj];
/ ~7 S. l( D0 C }
4 F; D- q0 `% P) O. s
, K, H# t/ b d5 _+ k for (size_t jj = 0; jj < vec2.size(); jj++); {5 a% h- r* I
{% I1 g, ^$ p. |+ c7 {% `: S7 {
b2[jj] = vec2[jj];
$ @- W+ I( k7 A$ H: K, Y }6 S8 p0 N- q3 k7 l* W8 I; l4 b, ]8 b
1 i, H! }5 L6 n n; s
//Method - 1 N=100000 247s 6 o9 t& Z1 P2 m7 [3 J8 \
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( O4 [4 R9 {, m
. a5 ?4 Q8 v5 V+ X //Method - 2 N=100000 237s/ z B- L0 b# Q' ^$ j! v
/*
9 K( s& Y; d( @; z for (int jj = 0; jj < N ; jj++)( q9 h- B I, l" i, \. M c
{- W2 b* o2 O* Z M* I" ~$ N
fresult += vec1[jj] * vec2[jj];
8 v8 b6 e$ U0 j9 L }; W9 s( X: U, l* f' r5 P4 h. d
*/9 Q& n; x7 n& [* x
0 H f1 L) D# M. X* V
//Method - 3 N=100000 204s& B$ y4 J) Y5 w3 q
/*+ C0 r H) c4 z0 b# a& s# i
for (int jj = 0; jj < N; jj++)! `- _6 Z! N( _" z7 K; Z' }' X$ y- a
{
0 ]$ q& Y! a7 y: w- X4 O' `: w5 } fresult += b1[jj] * b2[jj];0 l$ L3 m1 m8 K5 g3 q9 _7 z5 l
}5 B& t; l% T8 T5 i
*/
, f* `( r3 i# j" j5 j
. t, P3 K" J+ `% z# H //Method - 4 202s
4 p; i: v# R4 Y* p" G. X) I /*5 d! @& a* o+ q6 e4 r
for (int jj = 0; jj < N; jj++)
5 Y' y( Y! [' F {# S' D3 L% ~5 |5 e6 {: { c3 h
( c3 w1 {% {9 G( U3 N! n }
9 L! K. e/ K0 _ */ p& e* c/ D$ \9 h1 `
//comment out all methods, N=100000 202s
1 K" ^, ^4 O: Z8 W: B }
+ u M3 m, G, O3 R8 r6 E
. d6 F3 u8 h5 d. R n delete []b1;5 [' m% A& x" W4 G
delete []b2; 7 @, L: |9 `; X4 i, i: C7 Z. l; s
|
|