TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # d" J# x+ g. `
% c2 @" z1 @" j! f理了理思路,重新做了一个测试。1 M4 I, _; i! F
做了两个 vector 和 两个 float *, 都长 100000+ G. s5 T0 k, D2 [
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
0 [- E0 s& Q- O3 ?
5 o& e0 N2 D- b% O2 u. B4 N! ?内循环试了4种方法,( v" b/ u# s% E' m- n
1. 直接调用 vector inner_product 247s
( s* ^! S% X- z3 |3 I! k4 S& M8 k; y; w; w2. vector 循环点乘累加 237s
: @ n! {8 z% T" I Z) T3. float * 循环点乘累加 204s
' m; p* ^" |4 f9 P, i) {/ L4 t# w4. 空循环 100000 次 202s
; p0 N: b7 F/ k5 G' a6 i4 w! p) o( I2 ^7 {
不做内循环 200s7 @# b4 n4 C' m' n9 ~, l& U: l* G" K
4 _8 |+ N0 P5 {; T
你昨天说的对,内循环本身占比是很小的,大头在其他处理。* M5 k# M% [' M, |- J
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 D0 @- X* Z: S. V* c
. ^' S& c* e) E5 ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% ^3 } Z; N# J4 a( q1 w5 F- ?% n7 j8 l0 m
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)9 D5 P5 N Z+ p) c3 i7 N
* ^% h2 y4 i0 B std::vector < float > vec1(N);; f, f5 T% n7 V9 J: G' ]
std::vector < float > vec2(N);. H: B& N$ n4 z: U. H
float* b1 = new float[N];
5 o4 x/ c. l3 x |8 L0 v8 N float* b2 = new float[N];! y2 K* y8 M& O) I
( }) W/ ~8 l$ F6 x( x; y
for (int j = 0; j < 6000; j++)
* X4 ~8 _, c: X! M3 ^ {
" C% W+ _* Y$ S- R# r std::generate(vec1.begin(), vec1.end(), []() {
k3 N* M+ {2 @5 o1 r: w return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
! Y* T8 b' ^, d! T8 @; h });
$ W# R- `( `) l0 v( ~% }
! f5 |7 B4 k% \ std::generate(vec2.begin(), vec2.end(), []() {+ ~0 {" W5 w. ~+ H% ?! f
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
# F. m z! Z8 _1 b: E });
# p) ]9 {% t B" H1 a5 T' K( ]4 r5 y) `& r1 ~
for (size_t jj = 0; jj < vec1.size(); jj++)8 z" v+ H( b% E+ @
{ _9 W# A: A* I8 Z
b1[jj] = vec1[jj];
4 W7 a8 m: J. j0 I }7 ~5 P7 O) d4 f6 \/ G& r
- t- R# H- n# K for (size_t jj = 0; jj < vec2.size(); jj++)( a( ^6 \" Q( D5 A% X! A
{( E% f, \' [+ }, p8 }6 J, c0 ?. I
b2[jj] = vec2[jj];" }: A3 P$ a2 Y$ k7 Z5 o% `
}
1 W& s: o" }, i0 {" ^6 R
1 J. W5 i5 s" p. z2 p0 |% l //Method - 1 N=100000 247s
; I, v* p. |' \% r% B //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) A) ~% o* W% o" L X W% X1 a
7 @; o9 h, a) G: G. `% A6 n
//Method - 2 N=100000 237s
/ O# N, V' U. I! m" h, P /*3 e$ Q6 Q9 j1 j" q/ `. R$ Q# a6 m8 U
for (int jj = 0; jj < N ; jj++)
6 h/ P7 ]' s: u' f) x/ I {
7 N/ |0 ? X& c+ x* a fresult += vec1[jj] * vec2[jj];) W3 n7 N' |( W; m6 Y$ P/ E
}
& E# F4 ?) M& e# s1 A* N */7 h# H3 R9 g9 ]) i! a) K5 {2 W
4 U. t2 C8 C' S5 p6 p0 _0 B
//Method - 3 N=100000 204s& O: g! X4 |, w9 q- B
/*
' D: f6 S$ f2 |0 e0 E4 _# R3 R for (int jj = 0; jj < N; jj++)2 J8 l# }7 e" E5 p
{
4 Z$ a T: s+ P% C* W fresult += b1[jj] * b2[jj];
+ m% L: D- Y1 G) q7 k$ e0 y }* g0 i& d8 T- r. g" _2 |
*/
+ D0 I1 l" X% E' l9 C4 a/ J' d, c
8 k* K4 L# s: h8 g5 j //Method - 4 202s4 D9 a8 S8 C% F4 U$ c; L, A4 w
/*
5 L. J8 V3 a; q9 `4 S ? m; N for (int jj = 0; jj < N; jj++)
$ A) I' f3 B+ l" Y+ B, t {' L" h! ?# ^0 u$ j# o$ Z
! K2 y8 R* H9 W0 e5 [
}- p7 T9 R& b# u1 i$ q! p
*/4 R- B; `$ w9 e" W' C, t; K
//comment out all methods, N=100000 202s 6 F3 @" K. w2 T& A
}1 h# g/ Q$ I7 _# N& u, U7 s
. v% {: _7 k1 ^9 n: v/ g7 f
delete []b1;
" H+ V2 O- ?( S0 y8 V delete []b2;
: f6 s# b: D! q) Q0 D' L: Q4 | |
|