TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ o8 u: @8 k6 p. e& _
" k o& |6 g0 Y- |# F
理了理思路,重新做了一个测试。
" f) \* \& X5 }做了两个 vector 和 两个 float *, 都长 100000, ~/ B. i O# ` F( J0 S8 a
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.1 b( F4 h5 e f
4 v' }/ ^* B, Q" T# B: V" T- N内循环试了4种方法,. @' P# o9 {9 u* [
1. 直接调用 vector inner_product 247s % e; p1 M3 i3 z0 Q6 H6 w
2. vector 循环点乘累加 237s
7 N6 V$ h l3 w- P" I3. float * 循环点乘累加 204s6 n. w* `, T* P: A8 t* r
4. 空循环 100000 次 202s2 l& {) R( L8 d+ j+ ] j& Y
) f* |5 U! |7 V5 z) F) q: b
不做内循环 200s5 w+ W |" }6 d; Y( r
: k( U7 |* b' X你昨天说的对,内循环本身占比是很小的,大头在其他处理。
. \$ t: S- V4 v5 _! G2 j( J, l/ `另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 _& z0 _3 r9 i& p9 M& I
' E- Q9 d/ `. ?3 S1 q/ _' ?5 m0 E至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( v2 H; k2 G8 [5 Y6 r0 Q/ x1 D" m+ r( v2 R9 u
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
6 c4 ]6 k2 J- T% T) x# \& Z0 U# Q9 }. b; o8 }. Q
std::vector < float > vec1(N);* W: F7 b) v3 I
std::vector < float > vec2(N);& {4 I, n. s4 ^: D% t3 P8 C3 J+ n
float* b1 = new float[N];
: x5 b! _9 `# i7 t2 n) N float* b2 = new float[N];
8 k' O0 u) y7 u) q, s; l D: e y: `: a! G U, O
for (int j = 0; j < 6000; j++); H' U7 |+ D4 P! j
{
7 O6 \ q: H1 B. B3 ?/ U std::generate(vec1.begin(), vec1.end(), []() {
G3 i4 X4 D8 R# I! H8 a2 I6 |* R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
& Y) y' M- p3 ?+ B });: n8 p6 T$ h: P6 k; a8 C8 Z
3 i# X8 r' s4 b3 ^% W l( {4 e
std::generate(vec2.begin(), vec2.end(), []() {
( p. @; V1 S( N; c9 E% z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
1 G: n; U) q3 C( Y# s" _5 q+ t2 s });
+ x, `6 n" l* K7 b% f0 x, }* h+ o7 \! p
for (size_t jj = 0; jj < vec1.size(); jj++); q6 n9 j! g3 g4 R( a- ?1 k" M
{
# C, u+ g$ x- X1 H; A) F b1[jj] = vec1[jj];! G I ?2 r. o& ?' [& s# S
}
. ?. y- s5 W8 y8 U, L$ J
1 I7 z) A1 H5 W0 x7 Q1 H# x: ` for (size_t jj = 0; jj < vec2.size(); jj++)! W( v5 ~! ]; w# G- f5 J
{
: g R; ]/ v+ D: d+ s4 j b2[jj] = vec2[jj];( a3 J. x/ R' z
}
9 @, G, g$ R5 V6 s6 Y- v+ N4 f0 W
$ o: ^ D: [" ]9 U; M* a$ J4 L9 | //Method - 1 N=100000 247s 7 C) {" B1 ?& z: p$ Y
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
* M' N. V: _: ~2 \7 S* Y1 T
5 C3 H! n: J1 E) @# @0 g- f //Method - 2 N=100000 237s- Q! G1 ^6 n) C. H
/*
2 o9 z! Q3 V5 n, Z6 L! m+ X$ b7 o for (int jj = 0; jj < N ; jj++)8 p0 u5 b$ x, c9 I5 D1 G
{" P6 [, H" w: i' o
fresult += vec1[jj] * vec2[jj];
) e7 A/ t. B) K" p( R: w }, V# i7 ~" M7 m$ j. N: [2 T
*/
, H& z6 m4 N% e1 m! I; q( g 1 o; c4 Q! K) {: ^; |
//Method - 3 N=100000 204s/ e( `+ b: i9 L; t3 y( H; e& r
/*3 e" ?6 d$ h4 Y
for (int jj = 0; jj < N; jj++)4 p5 f1 r0 T+ o0 I r$ e. R
{; a9 Y. B8 j K+ \0 y+ S4 u
fresult += b1[jj] * b2[jj];6 A8 g+ Q! W, p0 b
}
5 ]$ M' J) h0 I. W; g( A5 T/ { */# D1 f3 h3 U9 E/ D( R
7 `# O0 s/ [- c' H
//Method - 4 202s p) w1 H7 R% W( J' \( p! w
/*
1 L4 U6 K& N" I0 ` for (int jj = 0; jj < N; jj++)0 d+ { H+ J' w1 A+ W" s D! q
{: B0 I) x" ]5 k$ w
1 d3 t7 |' q* R7 r, H* k9 G" A }
! O* L* I4 H: ]0 S5 W5 r& G */) @$ Z+ w! [5 R2 p9 i8 \+ \+ ^# W% u% P
//comment out all methods, N=100000 202s 4 J; @+ E% e0 Y" V
}; q1 [4 A2 Q4 v, v2 K+ x
5 y* ~, P% O0 U0 L# v" \
delete []b1;$ \! ?$ J ~8 J0 p; s& f
delete []b2; . B! V7 n/ o9 @; b* D) y5 e
|
|