TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ x/ |- t3 s* l- E( @7 m! d* q, m: N" L8 g& Q- e
理了理思路,重新做了一个测试。& h7 `; O5 j/ k2 ?7 C# g
做了两个 vector 和 两个 float *, 都长 1000005 \( v0 F* R4 a/ R: x
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 a) y2 e8 p3 j
$ k0 m$ \; b& |: U& I
内循环试了4种方法,) O: W# h& j, K `$ G6 a
1. 直接调用 vector inner_product 247s " N$ X% [8 }& `7 ?, t
2. vector 循环点乘累加 237s
5 O p5 J- e! p: d: d3. float * 循环点乘累加 204s
8 J% ?7 N" U; @0 E4. 空循环 100000 次 202s3 ~/ a: J8 q0 T% r8 I; j) W) e
m" a+ x- D/ B4 [" E
不做内循环 200s
! t& D* |7 q2 g- A$ `
- _" ]! c, L+ E, |1 w3 q- `- K你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ J. J- X: i* ?' c
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。1 t) @1 R/ D J7 r1 _! z
1 x3 m, G8 m0 K' g* L1 f: D
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
5 P Z# z* \7 h; J5 {7 I
7 g9 i7 Y) I7 {0 h/ o5 e(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 E2 u" c- f$ j/ a5 _4 \
3 `" b1 m4 t/ R std::vector < float > vec1(N);' x5 e8 F, Y$ F: l) @% Y
std::vector < float > vec2(N);
. b; e+ F* t6 o8 E" H float* b1 = new float[N];
, @! A" a6 x. A8 {. ` float* b2 = new float[N];' X4 Z# x$ M# t) `9 g. V+ b) F b
7 f' a2 F0 R) z! c9 s; l V2 P8 [ for (int j = 0; j < 6000; j++)
5 O; w5 g3 U+ k+ M+ P. \ {
" b4 a8 k3 u3 m& i# e9 m7 D4 j std::generate(vec1.begin(), vec1.end(), []() {
! {6 ]# K( k" n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
5 w: T- L: ^1 x) {. \/ p6 C. p1 R: { });
3 s& e# n! p' H: p3 }7 J9 I8 F, D8 a# s0 Z9 {) n I+ q
std::generate(vec2.begin(), vec2.end(), []() {
9 x8 C- f* I( h7 s3 d0 Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 \( a# |" `7 J" T' U$ S7 R$ l$ m });
2 F N9 \6 s: c; E6 g4 v7 V- `1 M# N5 M( A' N9 n$ ]
for (size_t jj = 0; jj < vec1.size(); jj++)
* B( b" U& K2 Q7 K) Y+ { y$ q" U& W {! J0 j% a: d9 A% E c
b1[jj] = vec1[jj];
; h- m5 y/ l* X' r }/ W4 ^# c6 A s+ q% g" n
! h7 m4 c( e" k4 y) v% a* m for (size_t jj = 0; jj < vec2.size(); jj++)2 @0 y5 d! @( _* N/ o0 L
{( j. |1 c+ Z( A0 i( H3 f5 F( {7 ~
b2[jj] = vec2[jj];; C: M0 G( |3 i) G) p
}1 y5 o7 c! q2 g2 e
) n0 X" B9 [$ w/ F% j1 C0 P //Method - 1 N=100000 247s " m# S2 ?* w- G5 i2 a
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
# b7 |/ A- W7 o0 X& r0 W . _0 i9 F' ]7 [/ ]8 {
//Method - 2 N=100000 237s- E! @. m8 ~- Z% A; n' H; S9 T# J
/*
& E- [3 ?$ _0 u8 D2 L$ A for (int jj = 0; jj < N ; jj++)
7 p5 Y) w$ R% ~( Q {
# [, Z4 E* { m" d0 t, c; N fresult += vec1[jj] * vec2[jj];) A' T; F& ~3 w* b7 S0 [
}
3 i2 y0 Y" I1 I' d/ h+ a */- J. e' t$ Q: c
* N s3 ^# g1 A
//Method - 3 N=100000 204s
/ I) P9 n: u$ ^: \) t/ I" t% U/ I/ g) h /*
; V6 d& t, r8 }8 s# | for (int jj = 0; jj < N; jj++)0 d |# _& `( X) T
{4 O. O; C' E0 _$ O: ]" K& S
fresult += b1[jj] * b2[jj];; ~7 s) Q0 i) f) A5 V
}8 v: D4 C- s1 a- k0 |# o# g" p9 X
*/
: A1 T- T- z* n; L3 u/ A6 w/ m e4 n, f* O* k _' r0 {
//Method - 4 202s
5 z6 h" s2 @5 n; K! ` /*
0 u8 U/ i+ _# M( d$ ^% F2 c: l$ p for (int jj = 0; jj < N; jj++)1 d/ g. g4 [% v
{
) ]; M* D Y. {7 w8 i) p0 L5 r
' H% R$ }+ M+ p- x% s8 \ }5 v4 }5 m! i1 f$ [% L; R& u, P( B
*// _: w: v1 z0 n( O G! t
//comment out all methods, N=100000 202s
& E( Y4 u6 N* ] }& B$ L& K4 B6 @/ W1 L$ G' z( U) y0 F
) \4 t' O2 a \
delete []b1;
3 X' }0 i1 G& i; x delete []b2;
, f( s. Z" y5 Z P4 \6 i |
|