TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / o/ e7 U( i; \$ C+ j
6 j" ^$ e* V# H) c4 {) f2 V0 G理了理思路,重新做了一个测试。
$ M0 v- Q6 Q6 ^" _) V+ s做了两个 vector 和 两个 float *, 都长 100000
' s4 q: X+ o: J, V* ]4 E. O' B外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 Y% x. C5 v+ s2 U" l
8 l# J8 o5 ~/ s7 P内循环试了4种方法,
0 c6 x5 ] d2 \) j8 i1. 直接调用 vector inner_product 247s 3 J9 D1 M# ~4 p. h0 m
2. vector 循环点乘累加 237s3 A$ x- `3 [+ O1 A' Q/ x4 j, [
3. float * 循环点乘累加 204s
1 B* u$ Q, V8 G4. 空循环 100000 次 202s
" h. L- T) k% E( U1 P8 O/ O. Y; X3 q1 O6 o
不做内循环 200s. v# p$ {4 w2 ^+ `: z: W G
/ x4 s$ N& l/ H' ` N你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, I' \* s# ]! o' x; L另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% m& A/ q3 w+ `
9 y! C q0 g3 N; ]# i ?& o至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 q- ^3 u! t5 h/ j( }! D W! U. [; r9 m
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
2 }$ {# Q; Z; t) _
) _; h, l- U$ ]- N6 B std::vector < float > vec1(N);2 |. t+ p, u% j. j* V7 [1 h
std::vector < float > vec2(N);
5 K$ U @' t9 R# }5 } float* b1 = new float[N];1 L0 `+ ?6 n# O' T( q! m) R
float* b2 = new float[N];# M6 w! Y* l/ R, w2 ?
/ H$ u( ?6 p2 \/ W$ Q3 o8 E$ y for (int j = 0; j < 6000; j++)& s& c. F1 L1 }: W
{
% g8 ]" a j8 F% z; L std::generate(vec1.begin(), vec1.end(), []() {
# o/ T0 b3 p* n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;* l" Q0 R7 q3 \, I, z2 X, T9 z
});
" E f9 V$ O7 ?
( v: X; t6 e0 B6 J. {4 S8 Q# Q std::generate(vec2.begin(), vec2.end(), []() {
0 W. }# q4 L) b8 {4 A4 Z' z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
) y6 H4 v. C- ? });% o7 t5 e! _. e5 w6 o
* S0 g! I, E. z- b5 a( C+ Z
for (size_t jj = 0; jj < vec1.size(); jj++)" v4 D8 g6 x8 L5 _; P
{! z9 y0 s2 I% }
b1[jj] = vec1[jj];
6 ?. U, P4 y: o5 [# ^ }
8 K% q) B- s# G* ^! ]
6 D# J9 S2 f# k9 V for (size_t jj = 0; jj < vec2.size(); jj++)
, L; [8 ?( j0 I7 Q2 Z8 E {1 C$ }) p* l) U8 e: h
b2[jj] = vec2[jj];% f/ w# s% w. a6 t4 \
}
# {9 B/ z" R9 B' n% S# e5 k+ S4 T# d( u' K* M- v' t d
//Method - 1 N=100000 247s + U; H& x+ H( {. \
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ m& f t! E! e, U* R( l
6 A( R: ~0 e2 H; ^$ D8 M& u( ]
//Method - 2 N=100000 237s! q3 j. S. ?& k
/*7 B% E/ S8 d) \- D0 _4 I+ d* N4 M
for (int jj = 0; jj < N ; jj++)3 ?/ y8 d9 `+ D2 }, K0 G5 ]
{
6 y& ]: M9 Z) Y/ T7 M) W, V fresult += vec1[jj] * vec2[jj];
+ S( X$ ~4 X9 W }
* ^0 S& g* O" Q) `9 K/ y */
9 R% s- {+ B& p' m6 T$ Y- f
4 X7 o% S) E1 p3 s' d Z //Method - 3 N=100000 204s: `5 W/ t. w" J* f! r2 e! n
/*
1 l( A/ R* a6 j for (int jj = 0; jj < N; jj++)
) G2 v* J/ \: K5 B& c. x7 x5 d {3 f7 p- n" S8 n: T' j
fresult += b1[jj] * b2[jj];
4 x, j8 e {* M }
7 K/ g( t3 v8 h0 P */
. K+ A- |' e; g4 e/ m& w; X" F) u
6 e9 a' \6 Z# I y M //Method - 4 202s& N+ M! m) M" W+ U: N
/*
# S3 \; {( p& D( z for (int jj = 0; jj < N; jj++)
1 _) i3 V7 s; D. i8 k {
3 i8 ], W2 V/ A5 \. M* q% d
: B* l5 q, I( I) K7 ^( _ }. u) F( Q, O) J
*/' R1 I/ ]- G1 x) a; _! A6 l/ |0 z: v
//comment out all methods, N=100000 202s # }2 }4 R) [1 y* }2 G' Z7 u0 H
}
1 [1 N, W2 M) ?& F( s
3 P; t$ C) G5 V5 U. U- S/ X delete []b1;2 J3 K" ]) d7 H- j( D
delete []b2; ; D- b2 Z9 I: u" J0 l+ {$ Z
|
|