TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
% g7 k0 {2 t5 P- n
0 a7 a" {8 J+ Q理了理思路,重新做了一个测试。& T. d e1 P+ b5 \1 x
做了两个 vector 和 两个 float *, 都长 1000001 q t) E2 m- U* R6 t7 f
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 |7 p1 y6 h: ~7 ^4 Y7 s
# C+ {; [+ O# Z( {5 u
内循环试了4种方法,( D: l% h, V# U- ?. o
1. 直接调用 vector inner_product 247s & p* s% I- K5 R9 c/ M
2. vector 循环点乘累加 237s) s/ T8 _% {1 Z/ r! n9 F
3. float * 循环点乘累加 204s. l/ b% `; E4 ~ ^
4. 空循环 100000 次 202s1 Z# G7 ]: N( P8 w/ Z
, v# S% |, W6 ?6 D) \
不做内循环 200s
5 ?) p' s3 r) R2 L# S/ I, M/ D5 O* H
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
5 o* l: h- o- O8 x另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 u; X- d T0 C5 E% e' F
2 Y! x" p! m" C* ?' J4 S至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 r, ~" r) K) F* L' m& L
- e% a' {9 N$ D7 e7 g! b! T, U- D
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 {. o5 o; a. ^2 P+ n t
" `7 T* A* t; T8 i
std::vector < float > vec1(N);
4 ~/ j' _6 o; [' A, k* [7 P std::vector < float > vec2(N); |. A' W" N6 _5 z
float* b1 = new float[N];# ]) y _6 S6 ^
float* b2 = new float[N];+ T5 }2 X5 A& v. P# r2 R
# _4 v' l* d; o, I
for (int j = 0; j < 6000; j++)
' I+ Y' P/ I u- R. R, B& d( m( c {/ w, H; M" r) x& q7 j2 S! {/ X& ^
std::generate(vec1.begin(), vec1.end(), []() {
8 m! B/ {7 W2 i' q7 f( Q/ g( b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, U2 |$ s }8 l% C* M
});& u& f; d1 e9 {0 }
, P* J1 y1 r/ V
std::generate(vec2.begin(), vec2.end(), []() {# L `+ `+ q3 F, _5 |+ ^
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: c3 C- V8 U; O7 Y0 ~
});
$ r% b: u" R2 B2 s9 r- t2 ?( H3 a0 s+ ~# \+ j) O
for (size_t jj = 0; jj < vec1.size(); jj++)5 B0 U6 K9 I# b
{
, \. L) r$ }, q& Z Q9 a" J, _ b1[jj] = vec1[jj];
9 n3 i# {! m7 Z8 i3 Z }
3 ~- z, \( u: U4 J: \7 B3 b7 l
: y9 W1 z" K0 X for (size_t jj = 0; jj < vec2.size(); jj++)
5 ^# ~+ u; ^. G; Q1 \$ c/ b6 \ {4 N% R; b0 X! Y0 h4 q. D
b2[jj] = vec2[jj];, [4 W R3 K- |# J! B) h( w5 h
}
( |* |) c n& ]7 {1 X. ^3 _) @! E# }; z- t0 L: u0 ]8 k6 a) w
//Method - 1 N=100000 247s % H' I! {0 t) r7 {$ c8 A
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0); E% H) P/ b' b- s
1 \0 l6 {; ]6 l7 V5 A //Method - 2 N=100000 237s8 }# A' i j: Q9 C2 T8 k7 i
/*
$ z1 g9 q- b! B" E& X- ^& X for (int jj = 0; jj < N ; jj++)
4 I( y' N* L' q v) O {3 N/ M7 f' S G
fresult += vec1[jj] * vec2[jj];0 t& E7 i5 r: g- ]: \* b- J
}7 H/ S! `, z& [/ t3 R
*/8 V8 j) {) i: z/ ^$ g
# {) [8 v( b7 [' [+ H
//Method - 3 N=100000 204s, R1 ^# x# y- l
/*
! B2 \, ?- K& x6 x; y+ ?: q for (int jj = 0; jj < N; jj++): F0 l9 O: t6 |2 w* ~
{' N& s- v( P s) b
fresult += b1[jj] * b2[jj];) O0 B" K9 `6 _% q, X+ E) G
}) b& e s2 P; U9 \" Y: @8 u
*/
4 L) _0 C% q( a' r& ?
! n' \2 ?* O6 {8 R //Method - 4 202s% e& u# q6 [4 R; Y+ T
/*
( E9 c( P# q6 a+ ? for (int jj = 0; jj < N; jj++)( {) G" V3 i3 ~
{8 @; Y. E: ^" |- R8 L& b
; K v9 I4 \7 O4 `$ { }
* A) i* l3 A+ l/ Y( e- V */
- t( H6 f3 e! Y8 s //comment out all methods, N=100000 202s
' n' D; v7 e- l1 \+ l6 t }
/ v' ~% p/ j1 u
' z0 v' h: m& x4 z& g) r delete []b1;
& C H1 v: X9 E+ | delete []b2; , i0 h: i3 q1 k5 ]+ W9 A
|
|