TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
9 n3 R6 A R ]. y* g# { {4 S
) c. N8 X; o* `% Z( N% r理了理思路,重新做了一个测试。" _+ U% n' b6 x7 I4 N2 z
做了两个 vector 和 两个 float *, 都长 100000% c* @9 c4 b+ D; | ]( t3 k4 u
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
: V2 B8 t6 {7 m4 [, V5 P3 r+ h% i1 e9 z8 L
内循环试了4种方法,
6 g% f# m" I h+ }1. 直接调用 vector inner_product 247s 5 g" H2 A3 m1 i1 X1 e" L2 R
2. vector 循环点乘累加 237s$ O# w: n( g8 |1 Z# Y
3. float * 循环点乘累加 204s
5 G# I3 C& E6 n+ d7 I, d" `4. 空循环 100000 次 202s
8 H" Z& `% P: `7 W# `
- D- e0 j5 a8 e5 q* Z0 W- L不做内循环 200s b/ q+ v% L$ O1 |$ o/ V
, u/ G" b# V( U _1 e9 B+ A
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, C4 f8 w, V; m* ?2 e6 d
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 [2 {; G5 a0 ?8 `* m2 j5 \" F; O
* n6 g5 g# @) R- w. T至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) i! H ^+ e$ I7 S
9 Q5 ~1 k3 G3 \" Z: [& J(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 T" \5 p+ |; X T9 W( f4 @ r6 _) V; M; c7 P
std::vector < float > vec1(N);4 p& r, F+ Z+ n& r4 ^. O% j
std::vector < float > vec2(N); x* r7 n' M- T+ q3 N# Z, N; Z
float* b1 = new float[N];
1 v1 O/ Z" ] ] float* b2 = new float[N];2 Y3 N9 | P2 L$ |( {
4 |! O3 z" L e' H* C7 [' K for (int j = 0; j < 6000; j++)# B {% ~3 \4 R- D
{4 o. p& a& u( t# f' D
std::generate(vec1.begin(), vec1.end(), []() {
/ S, d$ B' Y2 x0 r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! g9 t1 N$ s! n6 a$ V; G- Z, K
});0 n4 U$ ~. z) T7 W7 F2 T' R: z
7 a* S5 {- S- r8 p std::generate(vec2.begin(), vec2.end(), []() {
9 p: c2 m5 j" y6 G5 h4 c% X return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ d: H. N/ u+ j8 R/ i
});. F; i3 \8 }& o% U% r7 W6 E" @# Y( t
. w [1 [1 G! D# W* p" Q y1 X for (size_t jj = 0; jj < vec1.size(); jj++)
# v/ M" r1 b/ c( W { b4 s0 e p# F9 m
b1[jj] = vec1[jj];% U$ ~' q& B6 T* ~
}" I w2 b! z! ^3 r
0 o8 z8 R, H6 ^; t. @( g
for (size_t jj = 0; jj < vec2.size(); jj++)4 k: j2 W1 n8 D8 O
{+ y: R5 t- [. m) M5 D! a" n. n
b2[jj] = vec2[jj];( `" z) H0 X) q+ T
}
- H8 k- t0 F" n( T$ o) N# I5 {% ]7 y1 o; z
//Method - 1 N=100000 247s
/ S) {% r0 s# P: g7 U //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: n0 {0 S% @; A9 _3 @
7 ]9 g" Q7 l6 J, {) D
//Method - 2 N=100000 237s
i3 f( f4 b- S' n) X: y /*. t" E5 {8 }( e, d: ^% P) _( w
for (int jj = 0; jj < N ; jj++)8 k8 A1 Z* v/ N" X" Z5 I. s
{
# p4 U! }% x. C% U) [ r fresult += vec1[jj] * vec2[jj];4 @! i g$ T" u" g1 o
}0 q3 Q! l% u. o1 N( C
*/
- s) G( C( F7 {7 Q
% f# A7 D0 m) L$ R1 s4 D //Method - 3 N=100000 204s6 _' j+ C) ?4 P! h; z' v3 J
/*
1 C6 `/ r2 k8 E/ ~5 K for (int jj = 0; jj < N; jj++)! }# H5 x) Q. J8 D+ [
{( L" _6 i5 G9 b* O: S3 o
fresult += b1[jj] * b2[jj];
" {; t( n% O3 d/ Y, ^; h8 A F. v }% `8 u( L* Q$ l5 B1 D/ d
*/
) b# k9 [3 j9 B# \' x- `1 T& R+ i+ P+ t
//Method - 4 202s, F) A$ {" S8 ?' _$ t
/*) o# j5 [, F# U
for (int jj = 0; jj < N; jj++)
0 A# w* k4 o- Q$ O0 Z9 N& i: _ {
( h/ g' d' p7 X; Y6 I) n ; e+ d1 d* _8 w3 q! K+ n
}7 s$ F5 v. K' ^' X9 u" J
*/# W0 C5 Z+ I+ g7 y7 b
//comment out all methods, N=100000 202s ! Q0 ?; u1 v3 P4 p3 ^
}
0 w9 X$ J0 ?1 r3 M5 \2 R. ?" h/ i; r4 _
delete []b1;5 Q: r* @8 [" w! D/ v9 P' R
delete []b2; , j, o8 q7 z- }8 |$ M
|
|