TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 1 o7 `. `& Q, r, Y* s, w' z
! b( O& z. E# u5 c理了理思路,重新做了一个测试。1 A& I6 \. N, p! }
做了两个 vector 和 两个 float *, 都长 100000
* ~) G+ D/ {2 z; e' G( V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 k3 t* C8 m8 n c& l" F: Z* ~
9 ~3 J& A; W# D$ Q2 l
内循环试了4种方法,
\) P7 p, I* p0 ]" A Q+ ^1. 直接调用 vector inner_product 247s
" \' Z: J: F9 f# H2. vector 循环点乘累加 237s p+ W( O L; B+ y5 g( T2 q, `
3. float * 循环点乘累加 204s
9 p4 _0 [( j: k4. 空循环 100000 次 202s
% u. g4 Z( D/ S# m `: L; ~$ T5 j4 y# f
不做内循环 200s1 Z x2 U' o7 T V& c1 t
" e" m7 `2 j$ D5 C. }3 c( @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
2 W8 }5 l. A" ]0 C: x5 z' C另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
. s5 x% B) i, t# f% }' N4 g# o, F# O
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ P: Q$ a8 a3 a2 G9 m% {, ?
. E: E0 v$ z% y4 r/ u! U(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 S% O1 R( m0 w7 Y( r
$ A/ A1 S% {. r. G8 ~- T: z u6 `
std::vector < float > vec1(N);
3 @- a/ Z9 `3 K9 Z7 G std::vector < float > vec2(N);. s! z, }- w5 B/ L) x9 c6 L
float* b1 = new float[N];
$ I+ Z" ^# V3 o( F' T0 _ float* b2 = new float[N];' r9 n6 K h# d
# |+ v) D0 C! c, E2 A* L7 G for (int j = 0; j < 6000; j++)5 R0 ?0 N7 ~$ Z/ G$ ~" l) ^& D& r
{: u/ \+ l4 T Y7 @+ Y+ R
std::generate(vec1.begin(), vec1.end(), []() {9 j7 r" J5 u, L9 l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 n' @* J$ }. v5 f2 k. g/ E
});7 F9 V# ?" B, F0 [5 S' O
" c5 y% B5 \3 H: \( v. O, r: I
std::generate(vec2.begin(), vec2.end(), []() {
2 y8 z# M7 f, i* [4 M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; n/ B' O+ O" S: o9 z });6 p$ q6 c+ _* N2 Q" c& d
5 e) [5 ?6 h$ k' ~6 Y; v+ g7 u5 N for (size_t jj = 0; jj < vec1.size(); jj++)1 N5 T7 C, r0 J9 P! U
{8 o0 q2 S" @9 k9 Z6 z) E
b1[jj] = vec1[jj];
/ ?6 U% ~# _5 _ }/ Q/ O! Y7 k+ j+ S8 ?. l, p
$ r! _" D: d$ a, W$ @
for (size_t jj = 0; jj < vec2.size(); jj++); a. t- K5 d) P
{
$ g2 R8 m5 k+ Y8 r; k) H0 g b2[jj] = vec2[jj];& d4 v' y9 U& f* N. C
}
* Q5 |# R j0 q; X1 p: z; G$ j5 l' m
) a( l0 j A! n! J) A2 \; L //Method - 1 N=100000 247s ( n* K' z1 {& e2 R* q$ u" p
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
U( z1 Q+ [0 ?! P- l! ?% n
+ Q- r; z _2 t# G$ U7 w. q, t //Method - 2 N=100000 237s
0 ^* v, B2 E- V0 _8 L4 Y) L: } /*
8 V- c3 f: V% P( o& K for (int jj = 0; jj < N ; jj++)
4 r4 @4 H* v3 G+ ~& ~2 H {
9 _! q' C" K. ~, F fresult += vec1[jj] * vec2[jj];
6 Y0 |% G9 i* i2 s }
$ Z/ a4 |) o6 |/ f) C! O */1 x6 A& F; }4 k$ ~( L: \9 a
8 f9 k# t6 [7 t2 |, n s //Method - 3 N=100000 204s
2 y! O/ ]0 F0 V K, d /*, X5 h$ l/ Y, O2 ?# S% c+ {2 C
for (int jj = 0; jj < N; jj++)
: S$ T4 N/ o% l* `; S {) k4 V X# i( _- j- Q1 `
fresult += b1[jj] * b2[jj];
& I% `& X' `9 F$ i4 O }1 {4 X$ W3 I2 Y: n0 E: q8 ~' W
*/
" D1 u/ a: j, t9 I' e* D, u
9 I& E3 d) e; i( a* {& P8 s& M //Method - 4 202s m& J; `1 L9 Q- W( q
/*: w2 ?, {. ~8 u+ b7 C; J$ _
for (int jj = 0; jj < N; jj++)
/ m% z5 U9 t. K. D3 g, g3 l {
, W2 w# Q, m h0 ^, O- `
7 ]# x6 [' x' h+ @ }% J* D# x2 D, W6 D) B
*/
- Z: _/ Y" Z: T; b //comment out all methods, N=100000 202s
( ^) l0 k, x" y0 B% `9 ]0 m }
1 C$ I7 _( |* w, B5 N- A* t! a1 h8 S4 l3 j. W
delete []b1;8 x8 O; f7 t0 T/ n' B3 g
delete []b2;
?1 f: r& ]9 a: K7 W9 I/ v3 u* d |
|