TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
% ]" E( u) j9 K2 q) T' q" h; K+ }7 H" t" J
理了理思路,重新做了一个测试。
: h- k, m; u) b4 O% r做了两个 vector 和 两个 float *, 都长 100000. L* F5 C( K+ U: E8 [1 Q3 P; Q$ G
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ ^- l0 }( @) a6 P M0 z
; V, I, z' }9 ^) }内循环试了4种方法,
) k+ Q. p/ J/ q* t' Z* }1. 直接调用 vector inner_product 247s
% e6 F0 J* i0 @, N- B6 v2. vector 循环点乘累加 237s( v$ y: ~9 m+ n$ F" e
3. float * 循环点乘累加 204s
/ {) C6 m. _! R9 W4. 空循环 100000 次 202s) M5 S4 z7 X3 z- Q. p
8 C, X# T$ Z' ~8 a不做内循环 200s
. {! E$ B) M9 e! x: @% A* T4 h B; J" z; H
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
* S! W( y4 l) j; X4 k另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
0 w2 i2 u" U+ w# j/ v5 c
0 u; v" C1 K& V至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% W4 g# z3 g8 S2 [7 p
) } t" l! a% u. Q; L" V, b" i(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 t# X. h# E; x: o
3 {$ }6 a2 \1 b7 b5 j. P std::vector < float > vec1(N);
# B0 x5 ?! \& `+ N' w0 G std::vector < float > vec2(N);( y* B0 g l' o9 l
float* b1 = new float[N];
k, f* _% V. W7 N float* b2 = new float[N];
0 G, _3 j$ B( S6 d$ g: W5 X5 A! p
$ [* {) b8 h/ h2 n; ^. _ for (int j = 0; j < 6000; j++)3 h$ l* _% ]& w- R
{1 J: {( H5 W7 u
std::generate(vec1.begin(), vec1.end(), []() {
" F. s* F8 ~/ g return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; a' Q% n% l( n
});
* w8 w1 d \. d+ K) ~, e
% ]7 x' V0 F3 l" r& p std::generate(vec2.begin(), vec2.end(), []() {) S; [6 f6 d# V0 ?* J& _: C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
2 t0 T# q6 [0 L$ | });/ o4 [) T( F% i- f$ H v
" |2 X0 C) G6 ~2 z$ P6 {; Q2 N for (size_t jj = 0; jj < vec1.size(); jj++)
6 |, i' M- Y; _$ T1 b {
' S& T4 @' l" m w$ d( Y D& y6 O b1[jj] = vec1[jj];
2 G4 z% Q4 x* u7 |1 o2 c }
0 J9 Y$ D7 [7 L4 ~/ X
1 S+ [1 q' i+ D5 s7 \: {! M for (size_t jj = 0; jj < vec2.size(); jj++)5 r- }4 {' [0 M( h! \
{
4 ]* L2 ~/ z, k+ B3 A, t. r6 { b2[jj] = vec2[jj];
) a. D* t$ Q. ?5 z3 m% I; X }
3 s, S& R/ Z8 {1 M' i* K! k8 c5 ^# G/ o' g, B7 f; s
//Method - 1 N=100000 247s
1 V/ y4 x4 o1 y/ _9 n //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ N* V# m1 L8 z. y
* P* Y1 J8 A! D8 \; R
//Method - 2 N=100000 237s
/ e& ?; f: f( c( ?/ R /*" P. e9 l5 X1 h! j6 r) j& M
for (int jj = 0; jj < N ; jj++)
9 s/ y- I, I# J4 X' U+ j9 k' j {) |! c' @- o$ B8 |# a
fresult += vec1[jj] * vec2[jj];, |3 ?1 S! N6 E) w+ J7 ]: ^
}
( [$ t+ X6 ~' c9 y' g */
; n$ j0 Z" U2 h0 R' a$ S/ b
& `7 ^8 @: x) n+ n' |8 A //Method - 3 N=100000 204s' i; I( t. n: R) E' W
/*6 Z9 d0 r _6 n5 t
for (int jj = 0; jj < N; jj++)
" W7 _6 W* q6 i {0 ^7 ~3 Z8 @! i; N; t0 J! ^
fresult += b1[jj] * b2[jj];
! K- X0 N$ A! W }3 Z* E0 ?! m+ R6 q6 o
*/8 \2 }, T- M1 x- K
% m8 V6 @* d) }
//Method - 4 202s
+ ^5 T8 M8 O2 E$ i* w% `% _0 } /*
2 W) M/ \' y" @ for (int jj = 0; jj < N; jj++)9 B" c! C; U5 A* ~ _0 H
{
. W3 b: I2 y2 L) ] ; ]) w$ ~- ]9 |; T) V* Q$ J# Y: d
}
3 z% }( ?' u2 r3 g */8 M4 h% w# c) {* J( E+ T' b0 l* e
//comment out all methods, N=100000 202s - _+ x9 r; H1 E: ~0 Z
}2 w2 Y$ G: J" F6 p. r
" X& p% ]5 o' m# O: V delete []b1;: E9 O' j" H4 \ i* T& E5 W
delete []b2; 6 X4 N" n, f/ ^1 [5 J
|
|