TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! x: U9 ^* C) j$ B+ O: y
8 |4 d& H2 x8 z0 v1 G% Z$ Z* O理了理思路,重新做了一个测试。( T' @, W& o G
做了两个 vector 和 两个 float *, 都长 100000; Y6 k k; V6 Y/ C# |
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
. u! b# D# n; ^1 Q
+ w4 n! d! \4 w% s6 U! V内循环试了4种方法,
. w. d! D8 z! c v1. 直接调用 vector inner_product 247s 3 E# B8 w3 S# v" B
2. vector 循环点乘累加 237s% n! j, \0 i! B, J4 v5 }
3. float * 循环点乘累加 204s
' z+ s* s: P2 M+ v4. 空循环 100000 次 202s+ }# M; e; N0 E3 ^% [; c
2 m3 j( F( [6 t) e1 V不做内循环 200s
% I' i5 c7 v3 J- ~" c8 ^ m7 d$ o# O2 D) l/ k2 }4 F8 n) Y
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 x0 p* Q+ ]2 q0 i, T: I j另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
2 p9 e5 w" y' a: S) ~4 O% ^1 t( K7 B5 u) L, h( T
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; B8 t9 w" Y- S) ?6 m/ \1 m
4 a3 ]) T1 ~" G8 a& u(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)" T) S0 G% }1 h& j
8 F7 V* [/ N- z
std::vector < float > vec1(N);
) c* m6 T! Q* {7 j6 W( E/ ? std::vector < float > vec2(N);+ r0 N: o* B) d8 ~$ ?7 t
float* b1 = new float[N];
6 d4 |0 f8 \' k. y g5 e- a4 ~+ t& h float* b2 = new float[N];
. C: f! H# B; _ a0 I. C2 V$ |0 P1 ^: ?
for (int j = 0; j < 6000; j++)3 w# N* p; \4 ?2 w% z2 h
{: o+ h+ }- r* \# y# v F% {
std::generate(vec1.begin(), vec1.end(), []() {3 P" h K ^/ M" p2 b' K+ c5 R# M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% b- i* J9 i) @; R$ t: V6 Y
});
% |/ d8 `+ n9 z# S" o3 }$ a8 `7 e1 h% h7 w, {4 K+ g. Y1 c
std::generate(vec2.begin(), vec2.end(), []() {
0 F5 I4 a+ ~. f: i7 ] return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 \' A. `! D6 q
});& c% E+ }0 j+ D |' a2 m
+ ^1 K: S5 q/ t
for (size_t jj = 0; jj < vec1.size(); jj++)
! B1 n7 T- \3 m# r {
) n- |, ~5 D% j# @& j; V b1[jj] = vec1[jj];
2 _2 G2 i" n# F9 z2 ? }
o) q0 p/ a4 a! P8 ~0 C: O9 t/ }, l: K# |; s5 e1 Q: M
for (size_t jj = 0; jj < vec2.size(); jj++); |' M. a" D4 i8 }
{
0 j/ N4 {& }( t9 R/ ~7 ?0 I U: ~ b2[jj] = vec2[jj];
+ ]& s+ {( X& B: k) N }8 l$ \& F# \/ k5 h
6 B. j; s: M# ?8 [% q* R //Method - 1 N=100000 247s 3 n7 |6 m! D8 m
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ f6 w5 c* i: [9 {4 I: s' _" C6 L+ M
; h8 [8 A- M9 o' h! d //Method - 2 N=100000 237s1 a- o* U! P+ G( Y
/*+ Z6 N8 l0 x/ p+ k
for (int jj = 0; jj < N ; jj++)
I I6 o9 K7 W: L9 x {- l' G8 W# J) f6 _# L& }! K, }
fresult += vec1[jj] * vec2[jj];
: v. b) ]1 `, n# j: z' W; Z$ S. ] }
& b& s7 ]5 k: ^8 i */7 m. G1 I1 @/ o: @3 s& y5 h# g
( z( v: `+ I8 l6 @ //Method - 3 N=100000 204s
" s7 L! ^9 W6 r1 C9 r9 D3 Y- V /** q: d5 T) L( {$ l2 X6 }
for (int jj = 0; jj < N; jj++)3 X( K- N8 V1 _* W2 g7 o
{
, z m4 l+ q% E# Z/ z: K fresult += b1[jj] * b2[jj];. F( c: \) Y) g8 |/ o
}3 g# A9 Y4 F4 w. w! Y$ I
*/! E' i: K2 P2 B3 `5 Z) L. S# u
$ ?: x# |8 {& y
//Method - 4 202s
/ O3 K. x$ T1 e /*
) \1 p6 W3 C* r5 J$ P/ E for (int jj = 0; jj < N; jj++)$ A( V1 q l* n7 v6 a
{
% \ H; E; J" o N: x: O! v ' f7 r% X- f8 \ ^0 q. }
}5 f% }: |) J2 I0 k$ [9 s
*/( H' J8 I; G' w9 ^' O* {4 F' W4 [
//comment out all methods, N=100000 202s . U' h, `6 T. q$ U: j* C
}/ Z/ \6 u* j2 o' d0 O1 s' @! ^& u3 ]
) Z% r& z9 x5 b2 Z- |. e/ x9 K
delete []b1;1 H9 S7 P6 a- z6 @
delete []b2;
/ O9 e q7 Y1 e* ]; c, `: s9 Z |
|