TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! b9 }; R# @' s3 q8 I9 {# m4 g/ N# |: U) P# ~2 I+ C- p
理了理思路,重新做了一个测试。1 p7 k8 O# g- e4 h, W
做了两个 vector 和 两个 float *, 都长 100000
0 j5 S6 A! q5 x1 @6 n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
: \5 K5 v7 Q3 X' ]; z2 K% ?
! U( @& x# t: x& O9 ^+ L内循环试了4种方法," c t" u" `" D* e* N0 B
1. 直接调用 vector inner_product 247s 6 e; z! M3 K; c% {& G F2 V
2. vector 循环点乘累加 237s( y/ r9 U) w" @/ e
3. float * 循环点乘累加 204s! _! Z! j N. V/ O, Z
4. 空循环 100000 次 202s+ X" M2 r6 |- ^9 @' @
9 j0 I: N% H, b, ?- o' e3 r不做内循环 200s5 j3 X6 c0 y/ X( w+ t C' T. u
" q7 i& i+ ^5 h' ?' | m你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! `8 z( ~5 r/ ]- I另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) [, d* t& Z# X
8 }- [6 V) ?) W; I1 u+ z O至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 ^: P& i& n! i1 N4 x5 z, s
: U# [ A- y" K
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)4 n- S9 t8 B# |& u- F
- X5 A5 L7 }2 r# A: Z& c std::vector < float > vec1(N);
. f3 V# l% K( N4 F6 m std::vector < float > vec2(N);# s4 s1 w" a0 I! ]' M9 t q) p" Z
float* b1 = new float[N];& t9 }4 h+ u- |/ T, j% E
float* b2 = new float[N];5 V; c! x, }- t( d$ s1 w5 j
( E% h" r$ V( i3 o" c( u" h
for (int j = 0; j < 6000; j++)' R% h8 k5 O% I6 T4 o% |
{1 v. c% S o& a* U N' _
std::generate(vec1.begin(), vec1.end(), []() {
# \4 N$ ~) S4 j) K0 \ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ r/ \. E; M. g, s* o
});& b3 F3 N5 o+ A; d" z2 y
! d8 D$ N/ M8 V) E3 k
std::generate(vec2.begin(), vec2.end(), []() {: t7 r. p( e# F2 H
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;6 i k8 C5 a1 H
});
. d# o1 {8 H& v! U$ Z
5 q) T. M4 n1 o& @9 } for (size_t jj = 0; jj < vec1.size(); jj++)( P9 {. [. _% i
{
1 {9 _! i9 u6 e% U' w/ S5 T b1[jj] = vec1[jj];
+ q& N( S# l, g1 i$ F, | }
* n/ m( o- A- s8 S7 Z
# y+ G9 l) }8 o1 k g for (size_t jj = 0; jj < vec2.size(); jj++)
+ L/ G! @( G$ L6 `: u- _" { {* f+ Z4 G! P+ B4 t. m
b2[jj] = vec2[jj];8 W2 X7 W/ e( S0 S) d
}
* t0 D. b2 g2 l$ p% i% Q& w) [( `8 v6 L- T( t4 @* F
//Method - 1 N=100000 247s x3 O9 ]2 H0 o* c [- |2 I" k. G( A; {
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ e, F1 |( c C9 ^9 H
2 ^5 m, i: P. p1 r% s! Z# h //Method - 2 N=100000 237s
% J8 L- `2 ^0 j# {9 [1 N5 w /*
( G) @* Z, L( Y* i4 t1 l for (int jj = 0; jj < N ; jj++)
: K6 P; w1 l' E. L, H! @ {# z8 ~- R2 V( O. t
fresult += vec1[jj] * vec2[jj];
+ B! u1 Q8 i! N9 N# N1 R }
4 }6 S/ s4 ]8 d */% y/ q5 n: Y6 S5 w: K0 {7 N* g ?
* c3 t4 V: E! R, y //Method - 3 N=100000 204s
) j" |4 I+ E5 y, ? /*
5 p; V9 Q0 c2 j5 \ for (int jj = 0; jj < N; jj++)
! q5 `0 B2 e% v' M* k {
' [# z# [$ J( d fresult += b1[jj] * b2[jj];
7 K+ B. x5 v) ^/ Y }' Z+ r v. v5 d+ }$ }' \+ n, x! E
*/: K5 Q3 d1 K6 k4 M2 x1 h8 @
+ U |9 @' Z" H8 a( `8 l& T/ t9 \ //Method - 4 202s
2 v, ?. M2 b3 y3 g /*
2 U$ W E" j6 i/ p; o for (int jj = 0; jj < N; jj++)" X: Q/ m+ l9 G* \/ ?2 `7 U; u4 E
{
2 C+ P9 _$ k" d5 t ) N' l* M! O A& H- ~1 s
} h& ]1 @1 p( V& |7 F1 s8 E, c
*/9 T. R, H# V, N' V
//comment out all methods, N=100000 202s 7 C% y! W2 C* b0 s$ k0 a+ q
}: z% z- Z6 a8 c8 U( Q1 K- }" V# F/ l
2 C# O' [, N$ E' M0 s. e
delete []b1;8 g1 }" g* a& c, A8 y3 G$ L6 N
delete []b2;
/ d7 S3 V5 j5 r- Q# B |
|