TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
: H1 I% p/ |% O0 v& C7 F5 D1 z: e
7 c+ e: W" j4 V( D0 }. D理了理思路,重新做了一个测试。
. C- z- Q0 r& H4 N做了两个 vector 和 两个 float *, 都长 100000: y% P; J9 f5 h+ j7 S$ h3 t2 w
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
: e' n" W4 E0 Y8 z5 |1 a1 i9 C2 P8 C: ?" R
内循环试了4种方法,
1 y: @) v: G5 s! o# K1. 直接调用 vector inner_product 247s
1 I: F- p, Z: d2. vector 循环点乘累加 237s
3 j4 d/ r6 K7 h; ^0 \3. float * 循环点乘累加 204s8 L d6 m4 n# r: c: `; x$ f$ |. W' Y+ |
4. 空循环 100000 次 202s
' v6 C" p& V& b( j6 E" l
. o! z& V8 F0 o V; N# S z. r不做内循环 200s
; m z/ ^* W8 T9 _: k. h
2 C7 T. c4 |( K3 {- Q你昨天说的对,内循环本身占比是很小的,大头在其他处理。
* v. m1 D2 p. Z5 S1 R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 z) S# C5 f0 r- |& c/ x
# T1 q7 L4 D' {' h至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
/ Y( q8 y- C- N& v
8 {: s `$ N1 f0 F3 P8 K; l4 D(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
. x) N$ O3 F- @, U; z6 ~1 }% |4 i2 [1 m; y; v0 j, Q( }
std::vector < float > vec1(N);- V/ v2 ^! D7 i# @5 [5 h
std::vector < float > vec2(N);
. \# p/ E! p [# u float* b1 = new float[N];
3 A! |% B8 O- W float* b2 = new float[N];
4 k. S; f) \: |+ i5 m5 y
3 [) @' S& f+ b$ b for (int j = 0; j < 6000; j++)1 s7 r9 O/ `' D& u0 a& Q3 Q4 a* S6 T, c
{" v: s$ ? m$ u1 O
std::generate(vec1.begin(), vec1.end(), []() {, ?2 H5 f! @* P0 q0 _: U
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' n$ X% K& w& q/ r& H+ b6 `' z
});
! W1 M3 e6 {5 ~3 S& N2 \9 Q c: V: K- F: F. ^
std::generate(vec2.begin(), vec2.end(), []() {
8 }: W4 f1 d$ D" S1 v; k return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! F$ h. \$ Y- v) ?
});% T% S+ I0 j6 t9 x1 y
) h% N- }! r O: Q1 w8 ~$ w
for (size_t jj = 0; jj < vec1.size(); jj++)! t/ W# a4 w% X1 w. {0 X. Q
{2 A# J: E1 r- [- s( b
b1[jj] = vec1[jj];
0 j' g8 Z2 P. B1 F: j9 h }3 @4 b: m3 h* w9 B6 D* y( X7 [
. v/ i5 H9 S$ ~# m6 ~ for (size_t jj = 0; jj < vec2.size(); jj++)% y$ S: Q3 l' q: [, O; I
{
( q3 o: D, \# t$ e) a9 e% ` b2[jj] = vec2[jj];. ?; O* |2 m0 ]! |& C
}
: H5 K! [! W, N$ u8 }) p Z7 o7 q
//Method - 1 N=100000 247s , y' S1 y- N! T1 K# E* n
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 x! ^) Z' N; d5 _7 S+ S* w: E# \% H . H9 [7 g& G5 q- t3 l
//Method - 2 N=100000 237s
0 O& Y0 `- n! x" L- g, c( s- ~9 D /*! o- Y( j/ w3 m
for (int jj = 0; jj < N ; jj++)
% Q2 W0 a; I7 X, Y) N {- J- }' |. @9 R5 \ A
fresult += vec1[jj] * vec2[jj];
/ N8 r; e; a! g \( D }% X" u$ M6 X3 B( k' \; h
*/
2 H. C0 Z6 i% f 9 u3 A# N5 J( J$ O" M+ V6 Y( S! \* z
//Method - 3 N=100000 204s
, F2 ]5 I9 c. W' w9 { /*; n t4 e8 x$ A
for (int jj = 0; jj < N; jj++)
% s( [) Z9 j; h- x& C& ^/ Z {
( R! b' F5 D! | fresult += b1[jj] * b2[jj];+ i) x7 m& X8 e1 g' i
}
4 D M6 P. `4 m# n6 k" G */
3 u( e) }: ~0 z6 I/ n# T3 d$ |- U4 c! v, @, n9 o
//Method - 4 202s& m$ P+ R- x" z
/*
6 P6 x( h) _+ v for (int jj = 0; jj < N; jj++)
) U8 |7 Q, \& @& {0 X( h {( V/ H0 i6 R1 _$ g( G. H0 [7 D7 T; o
8 }7 N- d8 v7 G& X; C5 f( @, i }/ h* i- V* O5 s6 | F; @' k
*/" M& k6 f4 h3 P, t3 b# a
//comment out all methods, N=100000 202s
& G$ U, ]& \- Q4 W, `' | }% l3 }- u, N" B' Z8 O9 U
! ^* C; G' _9 ~- S' Q: D; a; X
delete []b1;9 \/ w# P/ C/ Y9 s4 T- q
delete []b2;
& G0 V. h1 {; g$ W: {/ y3 C |
|