TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! e4 p( x7 u8 i- V2 h5 W
' a0 r4 L @5 O7 r理了理思路,重新做了一个测试。! a# E9 X; G& j8 R! H: I8 q
做了两个 vector 和 两个 float *, 都长 100000
( G3 `0 D9 w/ ]% y( X- A外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache. H/ w0 D4 T7 s. }7 b/ m7 Q. I
3 b; i1 R; r1 R7 t6 ^( L内循环试了4种方法,: |$ R- t6 f2 m" y7 u
1. 直接调用 vector inner_product 247s 3 K+ C* x% j- p1 ~
2. vector 循环点乘累加 237s
0 I3 u6 p( d6 x- l3. float * 循环点乘累加 204s
+ l& Y) W' Y% k3 O' v1 y4. 空循环 100000 次 202s
+ L, @, x; ?7 Y g# c( }) g! X# A' T O
不做内循环 200s# R5 U Y" v1 C& J4 r
5 f6 l1 Y$ Q' E# P
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! N- i$ u% Z( H& D. R* {# U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 e3 @2 R& p3 H( k% o( E, z- M8 @
. d$ J7 D0 X J0 w% `至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ v- r4 x$ J2 P ]' u7 b* q
3 X7 w# [% G0 d(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
+ P; H1 G( y' l! l; h% {# w( ~& o& v# \
std::vector < float > vec1(N);
5 P/ e$ N: e: @5 j& G7 [ std::vector < float > vec2(N);- m. A: l) {( H* j/ E
float* b1 = new float[N];8 @! U8 z6 e* N
float* b2 = new float[N];, b) L0 M' T) u, j8 v' E7 G4 s
0 w+ a7 J2 x# n- @" y: i for (int j = 0; j < 6000; j++)" u* k) j7 p( u: z
{
% n+ N: d; D T" s5 ] std::generate(vec1.begin(), vec1.end(), []() {
5 f2 ~$ j2 e$ u+ Y( L: R. W return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 N, ?' K4 H$ ?+ I% V3 J. t" r
});
7 X+ t& H; Q+ h/ B" V: X
, W0 B% b j _' g1 A! F- `2 ^5 G std::generate(vec2.begin(), vec2.end(), []() {
+ b% D3 `' c. u/ ?- L) u0 n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
/ E0 c+ S# \7 ]- ^1 O+ H });. J m2 |$ W, f% N8 ^' [5 G
, a' i, V! m' \; U9 G- H- n
for (size_t jj = 0; jj < vec1.size(); jj++)
* A2 X! h. r+ } t. e {
1 N2 U( ^; p3 [$ r1 S V$ M9 v b1[jj] = vec1[jj];
& c* R# z7 | K" ~( q6 t/ Q% h+ H }9 |: Q! N# L, d, E6 P0 [
+ k4 M9 T$ n( X' j5 F- ^/ v7 C for (size_t jj = 0; jj < vec2.size(); jj++)+ x) `0 d p( B/ i
{
( ?1 d; O! S" u" a b2[jj] = vec2[jj];
- M( h0 A. h) r& w5 c }% N6 B6 T, N6 Q7 @1 F$ Y
! C8 e; c: I& f# |: f$ I
//Method - 1 N=100000 247s
2 O' s X+ U5 O) R //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 W/ `, m4 E) D1 [9 {% c
% l% j8 I& c% _) o
//Method - 2 N=100000 237s) d/ T1 f, }8 M) W4 n
/*
0 ]( L) n, j! Z) J for (int jj = 0; jj < N ; jj++)
! V( [! h1 s# `- l- l5 \1 H {
8 u! b7 F/ d+ f8 W0 W1 ?* g3 X fresult += vec1[jj] * vec2[jj];
. F1 N5 L* u: W* k9 T) Z! X }
$ i- v( f- D6 r. a I" h */
2 n n# T) x; [" l / i( M. I1 J8 a d' O- H- k+ O
//Method - 3 N=100000 204s# @( F1 d" o5 i- g0 S
/*
8 P5 R7 `8 O$ o3 I for (int jj = 0; jj < N; jj++); _% n% h5 }# p! _6 \
{
/ }" i2 y4 }* b8 x% h8 U. p fresult += b1[jj] * b2[jj];
* A4 c' i% @5 H8 M0 o, ?1 l0 p1 n }/ x5 ?# \& g( ]" n, ]+ `1 V0 U9 R
*/
0 s' L7 r7 P; p+ d2 x9 F7 ]1 o; V6 G) K+ d& E
//Method - 4 202s
- X/ b3 L, n/ V% ~& ? /*4 w( |& e: }! v% a7 r2 w8 v
for (int jj = 0; jj < N; jj++)+ w# B0 O& N u' E- V
{4 m Q! `/ x9 R) O( t
+ O& v$ E7 h' L) i }
4 ?- \) ?3 g$ S8 }' H3 h */! m/ W/ q5 S, h- \! Z9 ]
//comment out all methods, N=100000 202s / Y5 N4 e2 N* h( r* D W( a
}1 H* S" l' v9 j' X1 O3 q1 @
& f! B! z2 ^5 c E( k0 s delete []b1;4 g% l1 b2 J9 c
delete []b2; ! ]( a0 F( O" B: w$ j
|
|