TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( ~* s, m$ w9 _2 {5 H& M+ g# e1 n U
理了理思路,重新做了一个测试。4 `9 `+ l8 a, J9 _" f8 g8 t2 Q! A
做了两个 vector 和 两个 float *, 都长 100000 E: n8 \6 M, a7 k
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
3 c8 L& O- u1 y- R1 `4 R/ j
0 A* }/ x6 D. M% l+ d5 ?+ A内循环试了4种方法,
/ z& ^% S* ~1 Z7 A1. 直接调用 vector inner_product 247s
+ c5 Q8 y/ a1 C) X2. vector 循环点乘累加 237s' f2 V1 @! p) A0 `& c
3. float * 循环点乘累加 204s
2 y A$ P. z, M' J4. 空循环 100000 次 202s
# c" U6 c- Q) [
w% v2 b T! v. Y不做内循环 200s/ B( `& h$ h0 h
2 G6 T5 m0 w1 c2 R, v) x$ [/ I1 a
你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 R+ F# `- u& R' q4 c% r9 d) d* ~
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ O3 n b) g% P4 X; a' A0 x
' i2 K1 h- z5 D( ^* f A e# d7 M至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 z( v1 E6 Z0 y/ ]1 R
6 v9 ^- E2 I! b3 f(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 e2 C/ p/ Q& N9 D: @9 E$ j! W
6 r. O- d- G- j* ~ std::vector < float > vec1(N);
0 X4 ?1 {% z+ |% f" s9 }3 Z) D std::vector < float > vec2(N);! p; N+ i2 e# X: s) B `+ N9 b$ d
float* b1 = new float[N];, n9 Q% f2 ~/ D `* N* U+ A
float* b2 = new float[N];
; A1 T& j- A1 E: }/ i# q/ B4 ]' g! p' h g. L
for (int j = 0; j < 6000; j++)
% }$ J/ E X4 S9 u7 o6 {1 P {, w. w) Z" m. O) O2 q7 h( Z1 l
std::generate(vec1.begin(), vec1.end(), []() {: l: P2 g; m. l7 N
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) u( I4 q1 M3 H- m( G0 z! a
});: p# w# y( e! Y) d9 W
, \' n: ]( i0 H: u2 S( D
std::generate(vec2.begin(), vec2.end(), []() {
# z: n5 R$ P3 `$ g$ x5 Y, } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
. l+ g( X7 S: F9 g) f3 b& L });: s6 N7 y- b w6 J( K. g2 c
& V/ O6 |1 P# x# j7 V for (size_t jj = 0; jj < vec1.size(); jj++)6 K- H$ \( ?+ C- f3 Z7 P8 L9 R6 s
{
/ e% l/ i1 e2 C' P b1[jj] = vec1[jj];$ d' d2 G# p' @+ E. G( ^& X
}
, o6 X9 O! |+ K2 E* q
5 t# z: n: v$ | for (size_t jj = 0; jj < vec2.size(); jj++)
% l& t$ s2 O2 N9 i- b" ]3 P {% A* k2 R l( Q C; ^" l
b2[jj] = vec2[jj];
# Q* G0 W f/ x% s }
' @: Q- h! a- U+ W F5 \' j b( a6 c7 O/ P6 H
//Method - 1 N=100000 247s
% H) w8 t* [: t# g! l //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. L9 v. j7 H1 {
$ p C' p3 d$ T2 c //Method - 2 N=100000 237s# }3 u( G4 k( e6 _: V/ R
/*
% e h8 T, h A1 {7 t# Z for (int jj = 0; jj < N ; jj++)
# R2 Y+ f9 ?& t+ [7 m% {! n {6 p) q6 r9 z, @7 T. G) @
fresult += vec1[jj] * vec2[jj];
- e4 j8 l" y; [$ L1 c& P }7 \' n- [/ r" Z. Q
*/8 Q* N, ]5 h E# Y
4 C% K) T8 Q& y //Method - 3 N=100000 204s/ k. }7 B! K1 q7 [( t c
/*2 j w: S. v2 {
for (int jj = 0; jj < N; jj++)
) `7 g; ~6 g% O4 v9 ~/ \' Y {
! ~' k V& N0 Z3 `( ?8 w fresult += b1[jj] * b2[jj];7 a" t Y% ~$ ^" l" v) S
}% D) b5 e1 Q0 M0 T0 x0 Q
*/
3 C& R& K1 Y; D( C( W) B3 Z$ e$ v( N9 H9 |
//Method - 4 202s! ?, ~9 c3 E! p8 G
/*! w9 h* p1 `( Z# K: D
for (int jj = 0; jj < N; jj++)9 b/ o" \3 l1 |2 Q2 {. }
{
. a5 Z6 k# ^5 L
1 {( N' B* W) ~* v+ @! e }
8 {7 d3 u, A8 h8 H0 K5 R2 z */8 }! }* P! }6 w" k5 W: o6 x
//comment out all methods, N=100000 202s
6 e! Y& K6 F$ P) H! c5 P }: D2 k5 F) o% x" p, D+ t
/ d+ o& _% u q0 j2 x( s2 d7 \ delete []b1;
9 A, w7 a5 c. v5 A0 u delete []b2; / g l) W( C) W, o
|
|