TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 " _: A5 {. ~) a6 @+ [$ } K
5 C- g5 t. A, i& q理了理思路,重新做了一个测试。
_3 S8 c3 s% x7 \) H做了两个 vector 和 两个 float *, 都长 100000
* n2 @7 z0 T% c. m1 L外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache. A, m; J5 I/ Y! s/ _4 M9 ^
. Z4 A0 k: p, F
内循环试了4种方法,
: G9 X$ H2 ?4 D1 v1. 直接调用 vector inner_product 247s
: _( O; H- ~* d8 `2. vector 循环点乘累加 237s2 ~9 s! ~: l" I: y0 L( h/ b L* h
3. float * 循环点乘累加 204s# s0 G: ~( P) c8 L1 M) M/ N
4. 空循环 100000 次 202s
7 j$ X+ W. g. Q+ p, p
. }$ i" p, t0 S: N9 B不做内循环 200s, \# h$ X2 K( {5 Y% |9 P
6 k* X2 e4 Z. d8 N o5 Y, n你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 s( h) V' o2 _( S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
+ Z$ e6 T$ @+ k# ]
( Z5 l3 O; t2 l4 o3 w3 O至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 g" u- u# j# c* N( g9 ^/ ^# v; [' N4 V. `, A1 ]9 l
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)5 {* r: f! x: O4 [/ G8 V! z7 _8 s$ I+ g
. ?, F. E) n8 `/ T) L8 I( i std::vector < float > vec1(N);5 x$ V. w" S0 D5 S4 A- V: H( s
std::vector < float > vec2(N);
: Y3 n+ ^6 U0 k) {* u+ V float* b1 = new float[N];7 \5 ?5 b+ K4 E1 c' z. z" W/ P
float* b2 = new float[N];) f/ U2 f: |' d5 w, f) U
. n& M, c8 z0 u5 K) ~& C: W: l4 A8 \ for (int j = 0; j < 6000; j++)
9 ~* ^9 @" x# q& e3 E3 T) p {
% N0 s5 K# q( x% q1 y7 ]# U6 Q0 R std::generate(vec1.begin(), vec1.end(), []() {& w5 c& g1 B7 U2 o! b- m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ k$ i6 W; k5 ` i
});- x) H" o7 ?, t
7 w& C+ f1 f) \" A5 p
std::generate(vec2.begin(), vec2.end(), []() {: ?7 D. B; |- N
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 D. r- b# l' L. y5 I });
2 P$ t. p6 j4 ?9 u+ x7 y
( f* I& J7 v7 w3 `' l. z0 `1 W& e for (size_t jj = 0; jj < vec1.size(); jj++)- [8 S% L# ]- a2 F' e1 U3 ^5 m! l& {
{
% M1 j# o& L( r9 Y7 B b1[jj] = vec1[jj];
+ g3 b0 Z' e9 ]+ A }
" D( O i- ^# k
9 ]% v# p9 e P. E9 u+ |: D$ | q for (size_t jj = 0; jj < vec2.size(); jj++)
2 l# _( ~# S0 O$ w- X {: U0 _5 Q$ N6 g: K
b2[jj] = vec2[jj];1 d! W- s: B- Z: N' M- d
}
/ L m$ f8 [1 o1 V: o. f
$ f( B$ Y/ H9 m //Method - 1 N=100000 247s ) X a! n q, i9 _. y
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 U& J# {& h/ U) H' Q- j C
) p4 Z. {7 T, s% I( F- r" U5 r //Method - 2 N=100000 237s
+ l* k. p4 ~% g, a6 L& s /*' K( k+ _( M0 V
for (int jj = 0; jj < N ; jj++)* `2 H, q$ W6 i% i ]
{8 t3 G- j( Z% n2 y4 s& I
fresult += vec1[jj] * vec2[jj];
+ w; Q' e" P5 S* k% Z% F }
( j: n2 s, R6 {3 A */. q: r0 [6 Z- @8 ^3 u
- p, \6 n* Y# B$ ~ //Method - 3 N=100000 204s1 H$ k( }) b# \3 n9 o& R/ B3 p% f
/*
# q( J% k" s+ Z# z1 V* z) A for (int jj = 0; jj < N; jj++)5 G* o, @; X# D; L" Y
{6 I* x% g0 P7 J% |8 A
fresult += b1[jj] * b2[jj];. G$ H' B K- b8 J
}) \3 z3 ?: Y4 a+ t7 D
*/* E" G {) L+ i8 G7 Z; d
E+ T' G/ a3 A4 d1 j$ g9 o
//Method - 4 202s
% {) i( E1 y! g9 _ k: K /*+ ]: @6 z1 l& d/ [
for (int jj = 0; jj < N; jj++)$ g! G! Y; s0 }" p, c: S! M
{3 |$ o# m# p9 M5 f, D4 I! I
" O5 B/ b$ H/ w' l$ J }
3 Z+ [9 ]/ U+ i9 o */- K; T( x5 h( ^8 {
//comment out all methods, N=100000 202s
: }1 A, p& M) r9 q" K a( D7 U. e }
1 O1 E& p' Z+ x( @2 y% N
0 p# F* B. [1 j% I X delete []b1;! ?% q6 o- U/ ]
delete []b2; * g; r6 i8 X) Q( a- n( o* q& m0 \
|
|