TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! T4 B+ S& n) T5 n/ X [! Z5 q
" A1 Y; O( \/ {: k理了理思路,重新做了一个测试。; s$ K6 W }3 {7 R+ `. m
做了两个 vector 和 两个 float *, 都长 100000
. ]) {9 y4 _8 @8 f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! y3 q& Q9 U- a2 y" v! y( Y; u! @* l; f% K6 y( ^
内循环试了4种方法,
3 V( d$ P& h3 r) }- K: t1. 直接调用 vector inner_product 247s
% e9 \: Z! R2 ]* J b+ r1 |0 B2. vector 循环点乘累加 237s
1 E/ d5 S3 F, _# o3 Y, a3. float * 循环点乘累加 204s
6 d- T$ k- `# X7 D, u" l4. 空循环 100000 次 202s
& @% h- H' ~% K; J: y& @, W5 ?, t# e: J0 J( P+ q. s
不做内循环 200s
2 U* i& K1 A L; A( L0 L! ^
! W5 {; R/ Z' h; U你昨天说的对,内循环本身占比是很小的,大头在其他处理。
5 p4 p. o7 T/ _" q另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 Z! [ P Q( P9 l/ u9 ?
$ e+ x' m; }; i! M, Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) N. e2 a4 v/ X
5 G. X8 n, B7 R4 ^8 q% e
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 w i3 |3 _9 }; ]
( Y1 j2 B9 }% D9 y9 T std::vector < float > vec1(N);/ B8 F3 s# T& y
std::vector < float > vec2(N);- U) C: q0 w3 Z) f* b8 C
float* b1 = new float[N];
0 t a% f( u3 I2 X7 d$ x7 S float* b2 = new float[N];
; o6 c- f0 E1 q. @, P7 F/ S9 h0 ~, Z, r1 Z
for (int j = 0; j < 6000; j++)) O7 L$ X9 {* n8 O0 D
{* V- W4 p3 b1 b4 f3 g4 ]
std::generate(vec1.begin(), vec1.end(), []() {
" W1 [7 i( Q/ v5 \* H2 Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% s0 S, L( \) i; U* [
});
' R/ K) Z) E- p5 A; `* K/ W8 ^4 Y: b7 c
std::generate(vec2.begin(), vec2.end(), []() {( ]5 D7 N. g, @) {, T6 a1 E, u9 L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
( ]; K! s- o) L1 Z v8 ^ });
' S/ y) |- [+ u! o2 B$ `
c" R; e. y0 q% N+ A. y for (size_t jj = 0; jj < vec1.size(); jj++); s% ~3 [( \9 [8 k& u/ k
{
- ~; g# k' ~: L) |2 z b1[jj] = vec1[jj];8 b; y* f" R9 g& O. A4 ^4 ]
}- D, F3 P% ~: @# w/ A
1 e8 V6 F2 k& h Q" g& w
for (size_t jj = 0; jj < vec2.size(); jj++)$ s+ X; j9 B7 q/ ?! w% C
{
: Y5 t. G9 Z% X% v5 w9 k b2[jj] = vec2[jj];
* o7 G! t( O r* h }
/ O8 z) G6 v, O
% o% W) K* [' v0 _, N: J //Method - 1 N=100000 247s
( I) }" f3 R( @1 A2 i3 g //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 a$ @: q6 ^6 J x, p4 b 7 v$ y9 a7 _2 H
//Method - 2 N=100000 237s6 o' M& x' O* d
/*
% l- i! z2 m. W% g- V, C for (int jj = 0; jj < N ; jj++)
" z* _ u! j ]$ {% V {7 Q8 {7 @' ]: P! _2 z/ c1 }
fresult += vec1[jj] * vec2[jj];
. f4 v& l3 R/ _ }9 ]1 s. v! d- V6 F! ?! _
*/
0 k: R# l: Y! m: q1 s # @/ ]% Z: b' y
//Method - 3 N=100000 204s
, r3 h5 m3 J2 U6 B4 N9 C+ X /*
2 _7 j7 R$ e2 V: j9 g: Z4 F for (int jj = 0; jj < N; jj++)
' v& }" d/ S. f! c8 L" ~ {7 e' z. |* T( {& A, r1 m
fresult += b1[jj] * b2[jj];
$ s6 @; d% ?! A7 t: A: u }
/ u) ?& m+ o% `. L */
0 z. Z$ I9 K; L6 A' Z7 X/ F
: b5 l0 F) y( b //Method - 4 202s- I; [7 P, X2 l; z9 n+ @- G* B
/*
; ^' v* _3 ^* X5 J" {( n% N for (int jj = 0; jj < N; jj++)# K: y8 @& t, d% N1 y( r2 f" b
{
0 H5 i# G5 Z4 ^# a$ q/ Q + E' K) Y3 F. v8 R, E5 M8 Z1 c
}9 J$ G, U! r! C R- |+ N) M: J1 ~
*/$ `& P# N. @. V' r: ]
//comment out all methods, N=100000 202s ; ?" q' @; y* y- w
}$ o5 E) N: _' {' z
( T: Q; W: t" o' J5 { delete []b1;& H% w7 a( P* _7 n* }) Y0 \- `
delete []b2; 7 w# w# W1 b4 j3 Q+ k# i
|
|