TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
3 [0 n' q: ?5 a( W
+ Y. K* v/ o+ X理了理思路,重新做了一个测试。
. _1 A4 s" W5 S做了两个 vector 和 两个 float *, 都长 100000: {8 t' g5 h( r; K* Q& F1 L
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache. L- @5 J/ v' V' G6 r# F$ i
' ~- i& x, v3 V* X3 i内循环试了4种方法,
1 H& @4 f5 P8 R' D, T7 v% l1. 直接调用 vector inner_product 247s
# r9 r) h( }) d9 A" t# |2. vector 循环点乘累加 237s
7 s( a9 M+ u$ G* V5 F% u% p3. float * 循环点乘累加 204s
$ x. N! q' E0 D4. 空循环 100000 次 202s
4 b$ v5 v! p) [" Y- {& g8 z. m
* ]8 G8 J+ ?$ _- M- w. X不做内循环 200s' m. j( U C# _- c$ T g
) w) E. D% N! N) R0 h# T/ i" a: \
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( u$ O) S- P- e- J- c- k0 J另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 k2 b: o* T1 A$ Q! K- N
/ F' y4 b- Y9 M! S8 x" C* V3 |" T至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). F( d3 C; F, s. J9 i F; I6 a
0 v+ r/ z( O( L G7 Z, O
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)) ~) B. ~: Q+ Z+ \/ b
. z. H, i5 D+ }8 t std::vector < float > vec1(N);
7 \# w% D) L9 j0 j: a: Z" K std::vector < float > vec2(N);
/ y# V: S8 ]7 t/ v4 q3 m5 P4 l float* b1 = new float[N];
8 ~2 V$ \( c y7 U float* b2 = new float[N];
, L8 y% b1 R, V) X( t4 G
! g. A4 N, d; V for (int j = 0; j < 6000; j++)2 B" d! ?" S6 L' }" u8 i/ e$ @8 L
{6 G; o/ s, u: d) b0 `1 n+ E2 {
std::generate(vec1.begin(), vec1.end(), []() {5 R f ^, I9 y& g5 I# A
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. }4 s1 C d+ w4 o9 e: ^
});
7 p& I7 h5 D9 t
* E2 C/ l4 ]: H/ @3 X( L; O3 ] std::generate(vec2.begin(), vec2.end(), []() {8 m: T/ J; R7 {% R
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;3 u; d" g4 Z3 f- m
});
' Z& m4 T. U0 ]' o4 J/ Q; q' o' p
for (size_t jj = 0; jj < vec1.size(); jj++)0 {: t% j: ]! k) \' @3 }) e
{ |( K d1 q r& _4 O4 I4 x) i4 Z
b1[jj] = vec1[jj];1 @& s4 A) @$ f4 u
}
x, K( O9 ^* H5 ^8 h* w. z6 {
4 @& l" b9 e$ ^( G5 p for (size_t jj = 0; jj < vec2.size(); jj++)
* Q: i/ \" i( P {6 D, K, i" O2 T: O! x- l
b2[jj] = vec2[jj];
) H9 B D4 y0 Y* Z' p$ J; L }, |( q$ j' i7 u1 S' F$ ]
9 T* D1 V; | C6 |+ y
//Method - 1 N=100000 247s 7 H, { l- @, `3 ?/ D! n# T# n
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 Q& B; }7 o8 P0 T: T6 Q. x! o8 D
6 v1 q- M, A, @% s' }) N) a* x //Method - 2 N=100000 237s
% `; ^$ ?6 e8 { /*
# ~/ s5 ?7 J* I0 o. L for (int jj = 0; jj < N ; jj++), w* }# q8 b. `5 J) v ~
{
$ `, L) C( c6 n4 a: D% B fresult += vec1[jj] * vec2[jj];
$ Q4 S, r1 ?# e H) R }' C1 Q9 W0 X, w8 d; H1 Q" O
*/: t! h' y+ l) l% H
z r, d- K% v& k' j0 s9 } //Method - 3 N=100000 204s* H$ ^6 w2 f& |3 P) f- p
/*
0 V: c$ t1 A0 c* G6 Z p for (int jj = 0; jj < N; jj++)
0 s6 K9 S9 w+ {1 I6 C {
( O* i2 O9 v: N9 C# o1 \ fresult += b1[jj] * b2[jj];
7 B& E% j4 M( `& M }0 m* }4 e4 B, f7 M9 K8 Z
*/
+ q) V! G% \# C* ~ Y( o2 U# {
8 v: e2 y6 i; @3 K5 o //Method - 4 202s- m) C9 ~: l; x9 l4 C7 T0 g
/*8 U6 m2 Z; Z9 f4 s# E
for (int jj = 0; jj < N; jj++)2 ?: f) d8 ^# T- n1 \$ u
{
' j! ]" l* v B, _$ w, ^* a
: b* M) Q% ]% C* v% U } i- G7 }2 R% Q# \+ w
*/
& A: L$ ^" M& i5 p //comment out all methods, N=100000 202s
! n: z3 V% @$ s3 U) Q! \2 Y8 B. j" S }
' m" o' e# f7 i+ r
+ @7 ^6 e8 R) [6 N/ ]$ O- d delete []b1; s/ N! X6 x2 y# m6 z$ U# x! A
delete []b2; ; @2 @5 P4 X% T
|
|