TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; l' f: y7 _; D/ [3 w
, O9 S& c F+ |2 h8 A9 q+ D& r理了理思路,重新做了一个测试。
; F5 U2 _1 v8 F* ]- x3 t做了两个 vector 和 两个 float *, 都长 100000
' h0 P$ f% j! h( c外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: P8 v& h4 L1 p j* c
/ T4 \( w r! `: q7 |8 F内循环试了4种方法,+ h+ p# Q* F# e$ l3 ]% ^
1. 直接调用 vector inner_product 247s @. l& ^# b# K) E( L
2. vector 循环点乘累加 237s
5 D) d$ P; j5 b$ { M( X2 r: w3 N! ^3. float * 循环点乘累加 204s
: s4 H% k& T* |) e4. 空循环 100000 次 202s* V6 n) |2 H9 M4 z) C& f# W
- M6 h7 d T$ }" l3 b8 M+ U5 R. [8 y) `不做内循环 200s& t* F3 a1 V$ P
) y7 F! |, O$ K" O3 z
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
/ ]7 K0 K" @5 z% m( r4 z另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 l3 v2 h2 l# N, b. p/ l1 k
# P& G$ W5 D; s至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( B1 Q% w6 O/ t! \* \. w8 _( C& V: Z) [0 W
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ A; ]# h7 Y; E# ]5 o
* J- X* i6 x) E/ K" u+ m7 l% _ std::vector < float > vec1(N);
8 y5 y+ V6 H4 E6 p3 R std::vector < float > vec2(N);
* c p7 Y$ y# `) W float* b1 = new float[N];' R( U' h- W' V* L( S J
float* b2 = new float[N];$ h2 e/ g( n8 Y' L
0 e! a3 L4 P$ K1 a for (int j = 0; j < 6000; j++)
- ], q% i* s8 S' D6 q/ v {
+ q3 e; L g+ Y8 B0 E1 { std::generate(vec1.begin(), vec1.end(), []() {/ t5 g& j- k8 v* ~2 o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" P" R) e1 |- t3 _* A
});
( B4 ]# l, J6 z6 O: z1 `3 {2 H% V _+ f+ P+ _9 I6 z
std::generate(vec2.begin(), vec2.end(), []() {
) C. S7 @$ y& L. i2 ~1 x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' H# {# j0 L+ [$ e( a
});
O5 n- J( `' m. { W* h7 u2 u: @! [% Z1 C( A/ S! F2 B" l
for (size_t jj = 0; jj < vec1.size(); jj++), M& [, l5 E+ \
{# b) m% [. k2 s6 |) h9 z
b1[jj] = vec1[jj];
! v7 x/ \6 w. X0 C! J }
3 s# n# k+ F7 x& I. a- `5 ~- j# l
! ] N( U! A) `$ I' Z2 @ for (size_t jj = 0; jj < vec2.size(); jj++)
) L% g. E, z& _! A8 ` {, e( L! u$ {, ~
b2[jj] = vec2[jj]; |8 u4 I9 S4 t- ~( {+ _, i
}0 y- j$ q+ ]3 W$ j$ h3 x! j* o" G1 M
0 Y k* f6 G" r# Q
//Method - 1 N=100000 247s
4 G3 P% {8 V s2 \3 N //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. k' ~! T& I* Z) r6 O ' H& ^ ]. T7 C* _
//Method - 2 N=100000 237s
+ M% C3 y# z g /*! h0 [! W) a+ ^( m. g
for (int jj = 0; jj < N ; jj++)
/ _) V; z& ]* z5 L* k7 t {6 Y! n5 a& v1 w% c. d
fresult += vec1[jj] * vec2[jj];
4 Y3 n9 I! M6 x3 \( K1 ~ }5 \7 v: L3 a& S( r. \9 F
*/
4 X. l4 n& l' D T- E - U" d! l& H! j, ]6 ?2 @- B, u
//Method - 3 N=100000 204s! q( p" i* H" H3 F0 m N
/*! V5 T2 ?4 G* _
for (int jj = 0; jj < N; jj++)
: G$ C [, [- b! s2 M {. H9 i7 \! G) @. R
fresult += b1[jj] * b2[jj];
* j. {7 Y- B, i1 ~- C }5 L8 a) H2 v3 ~7 @+ p
*/
3 ~6 Q$ q8 ^1 \4 @& w' F' @) g: L# q) s( r9 Q
//Method - 4 202s' R' G5 k% C: G: e: r Q( p6 N
/*/ B5 o5 ?( |: X+ w
for (int jj = 0; jj < N; jj++)9 X4 i/ O' p( r- W% E
{
, v5 k5 l2 j) u) f, Q# x, u1 C
2 @: a: Q( V; y) B } m X8 @+ {' y$ V' _8 u% o
*/& c+ q8 ~+ Y' A% \7 t7 T- W" r2 U
//comment out all methods, N=100000 202s
9 J# A) G5 k* X1 ? }6 J0 U, V2 ~5 H5 x& {/ j
; ]* D! N: ^# R$ E' ^+ _
delete []b1;' ~; k' M9 H/ p! I# L7 `
delete []b2; % _1 R8 A% r6 k5 R+ c+ Z
|
|