TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ Q" K9 g9 U6 U
' L5 `4 c5 l! G, [
理了理思路,重新做了一个测试。5 f! d& ~& |2 F' `% L$ y( O
做了两个 vector 和 两个 float *, 都长 100000
! a: g& u2 N' \外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.- I$ S6 x% J- ? q8 g$ r' q$ B1 o
4 L2 S5 ^$ i5 y9 H" n/ d1 m H内循环试了4种方法,6 t. k" T- O( r# w
1. 直接调用 vector inner_product 247s
; I2 I! x" |9 I* r' Z3 q; Y/ R2. vector 循环点乘累加 237s$ K9 n% O& T$ C6 U
3. float * 循环点乘累加 204s( K% [" i- u2 e& }" c5 r
4. 空循环 100000 次 202s$ J$ b$ v6 A1 R+ \
3 L, u" r( g! d+ E/ f- j# ?1 l不做内循环 200s+ N6 [7 S. ^ p) ~- U7 |
+ E' W$ o; k) J3 c1 G) l
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
& _' Q* e# n, k: r& ^另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, _0 V; ~! j. i+ ]) T y9 d& x4 w% V& Z
4 @, i, e4 |* R9 A/ ~
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
+ x g0 I& v0 t1 o7 T. K& b+ x* A+ E- x
% f) h5 K' `# ~# d(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)# }, K- b8 g/ p% g r! A; w+ w
! j0 r) J l, B- P( p
std::vector < float > vec1(N);3 P- C3 q- b) ^$ K' V. f
std::vector < float > vec2(N);
3 u. P5 e3 M2 O- i& G" ^& P+ _' A: _ float* b1 = new float[N];& b1 h2 T5 j& Q; t8 M/ o
float* b2 = new float[N];, p. Z( U5 ]7 U% L5 K' O
; |- d; n, Q7 C0 s2 Y" b
for (int j = 0; j < 6000; j++)
* q' U; w6 S# x1 _8 b {
) m0 C/ s( m% n0 P std::generate(vec1.begin(), vec1.end(), []() {
3 {. t' W) Y8 i8 Z3 F return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) A4 n1 v' R3 q& C( c- Q; a
});9 Q: E( ~4 C5 o ~2 i6 V& m
2 b. B+ V9 s' x2 A7 l4 g) y- Z
std::generate(vec2.begin(), vec2.end(), []() {1 J( U+ ?1 R7 m& B2 J: Q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; [4 H$ B& }7 w5 E$ r/ y& R, ^
});
& A: d) l1 m Z T F" ` [3 J
2 Z# R, W T% U2 g3 M for (size_t jj = 0; jj < vec1.size(); jj++)
5 b4 R$ [6 X/ G! _- ^ {
4 W( Q" M0 Q$ X4 i+ s, }) F( l- \# I; N b1[jj] = vec1[jj];
( P. I# @7 h1 V: W0 h, Q: T0 H4 T, S }
j* g3 S: \$ r" ^. S2 ^
+ q7 c! \' A1 }: A for (size_t jj = 0; jj < vec2.size(); jj++) B! m' a+ _; b; q
{
: L& l& n) i& J b2[jj] = vec2[jj];
) K7 ~9 S$ V. u8 U$ W( i$ h! m, }/ | }
$ i% R- o9 ]2 P5 M5 i' s* ^
: k: r: b! @6 k //Method - 1 N=100000 247s & y! I6 A# }% K& O0 t2 O
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& W% f* g. @3 t0 H1 ?: w( K9 X
9 k; \8 P0 I7 l, e4 Y
//Method - 2 N=100000 237s
+ }& t: d4 H% I0 Z+ P/ ]" n5 r* q /*- e$ M- z' L K
for (int jj = 0; jj < N ; jj++)2 k3 f2 Z8 n' x( b" I, g
{
9 p! F; V- X1 E: T fresult += vec1[jj] * vec2[jj];# h9 N$ _; G/ `8 R
}
' l- c H2 @: }1 h; d* }) l */
; D1 {, {, o0 ~* h4 D# A# K 2 _2 L& j* J: @1 w4 X3 E
//Method - 3 N=100000 204s
0 M0 s, a5 s+ p- }3 ~" B /*
3 \+ E' ]1 O# z. T/ U& ^ for (int jj = 0; jj < N; jj++)3 W* y& Q% _! u' k5 ^6 i; { D
{& K( S% x6 S& \5 ~. A7 O9 K" R+ g- ]: O9 k
fresult += b1[jj] * b2[jj];
7 P4 S& J# o7 v: |5 F }
6 c5 }% X' Z2 t4 k2 F9 n */- L, ~- T- |( O5 [
+ V8 U& t; u0 B S* q: d4 P# ^ //Method - 4 202s4 C% M' L% H; y6 ?$ ]& ~' \, B |) \
/*% [9 ?- b* `' o" f9 i
for (int jj = 0; jj < N; jj++)' x- g$ Q& \3 @. F$ }9 Q
{
9 ?1 K* N: u- Q2 V* L1 j 4 F+ l, M9 b' ?/ E8 j Z
}/ s$ k4 E; {( L3 A
*/
" A6 m$ k. b- L+ X //comment out all methods, N=100000 202s $ l) g9 h/ V3 Q o t4 a
}5 q+ f8 i# J& L
) ~' U( o% p1 ]( J# r8 o* \
delete []b1;
2 Z. j$ o7 m, b5 g+ c" F+ O* S$ S delete []b2;
5 ~/ d$ S+ M, M& N7 V- ? |
|