TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - ?1 a, k( g) M8 ?2 D/ N
0 n5 K1 l8 p5 E. M理了理思路,重新做了一个测试。' G ~; F6 I4 n. C- O9 ?; W
做了两个 vector 和 两个 float *, 都长 100000" W* U" n% Q1 F4 p! k3 W3 B# f* E
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 P" b% X" |6 `6 P- Z x
# _! V! t+ Z' d3 r
内循环试了4种方法,
8 B _+ }% M- z/ m, G1. 直接调用 vector inner_product 247s - _3 [/ K2 n" ]( W& K, Z, o
2. vector 循环点乘累加 237s
! ^9 v3 Q4 c. I& [7 {4 a6 F; }( ?3. float * 循环点乘累加 204s9 C' ~ b: k5 S4 h8 q1 ]
4. 空循环 100000 次 202s
! S8 t' t, F ]7 L6 |2 `2 @# Q9 k1 G2 L$ d" ?
不做内循环 200s
@% k R% S/ O+ h# ]( O8 q# Y8 K Z! Q' z$ V1 V" f6 [
你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ ^! R) {$ X& K1 a+ ?# S O5 m4 ~
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 r5 g9 p* z7 u8 J) [2 w. t) z, p" g+ g4 g! A/ ^
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
8 U- s! F) G- O- A( T0 N# M" B5 W5 a6 x. n+ D& n2 n. A% A4 N
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! B. `% o; o5 `9 Q& ^! {0 u' {
- `0 _ N: M3 q. b( l" J& k9 Q4 X+ _6 \ std::vector < float > vec1(N);1 O' b# m$ n# o$ x" j2 H; ?4 K
std::vector < float > vec2(N);; z% I: P$ X3 D# c3 x
float* b1 = new float[N];
% S+ e, T5 r9 T/ R float* b2 = new float[N];
7 U7 P( _/ J2 Y- M' c; A" p0 Z- L T( K# e9 z! P
for (int j = 0; j < 6000; j++)
+ O: S6 ?* A. f9 p& ]" W, I, E {
' Q5 j% G+ v* \/ {# G std::generate(vec1.begin(), vec1.end(), []() {7 @8 m' \6 p" Z8 n& w
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) b) T! O# l6 b/ O
});4 v! F/ ~7 m+ u. Y
& A% L- p) W) f p
std::generate(vec2.begin(), vec2.end(), []() {' Q2 A8 N1 i& v: L) [# z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
7 c5 P- ~+ m1 a1 s9 ^! p/ r, d( O# Q/ d });
9 r1 O! d* C! W4 W6 O! B; z
: a- n1 g7 {; c3 h2 E9 f for (size_t jj = 0; jj < vec1.size(); jj++); h+ h& q4 M' d; o. _) A+ c
{% P7 b' J% e/ w' k0 O
b1[jj] = vec1[jj];
( d) s6 |: O# i W% ?9 T }
7 i) ]% v3 z2 s6 J: R& I- ]% n$ s+ z9 ]. \" f' S0 K: G
for (size_t jj = 0; jj < vec2.size(); jj++), ~$ |- ]) A5 k$ o. M
{
; U" N* v2 l' n9 J$ z0 O7 J b2[jj] = vec2[jj];
" H# w0 E/ t+ t E: u6 S }" y, O" ]9 \4 r
( y4 q" S# E; K2 `# G" l1 @ //Method - 1 N=100000 247s - Z9 L0 Z& X, C% E, X$ q- s1 L, N/ q
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
! i5 ]* q9 u X \6 ?3 l; ^7 z
! a$ @2 R7 N6 X3 y //Method - 2 N=100000 237s- B- X/ G; O1 m3 |6 u$ ~/ n. @* h
/*
* F, Y% C3 o; @* A6 A8 c, ^ for (int jj = 0; jj < N ; jj++)
8 y4 ^' V" i4 u+ W' a6 n {/ ~, l% c3 U$ R! r9 _( [
fresult += vec1[jj] * vec2[jj];
/ o& X8 n' M: H% Z, `# l2 F }5 W1 J2 n: R5 b8 b
*/
5 N& ~, { {6 b1 G) C) I ) J3 Y! D/ x9 s5 f
//Method - 3 N=100000 204s
6 d4 J4 _/ _1 D7 \ /*) F# n+ W8 t; @4 @% j
for (int jj = 0; jj < N; jj++)
) l! s2 |8 [2 Z3 M+ J# y8 B8 S {
/ \8 Q3 W3 |# V! S' Z! L fresult += b1[jj] * b2[jj];
- H5 s$ `, I) f7 b/ O }
) q: l6 g. l7 g# H */
" {/ j! {2 I$ @
& f) q% f9 V& i( V //Method - 4 202s
( i+ Y! n- p L /*' S+ t6 l. R# _4 V
for (int jj = 0; jj < N; jj++)
9 e( `6 H! z# \, y+ n! I' U7 S {0 [. e( D7 [" s1 L# t8 ]" T
) F. J8 \/ B9 A7 ^ }
5 J5 G, L+ e: @" y& W* S */
# k! K0 ^2 Y8 ^$ a8 _ //comment out all methods, N=100000 202s
# v# }5 H$ x' v) G1 z2 x }
9 Q5 g" U- A b( O$ ?* E
: O% o: f# t, e7 _, u8 F delete []b1;
* W, K8 B; ~" d0 B8 h5 n. C delete []b2;
; _! ?% i# f7 ~* g* |+ d+ E+ k |
|