TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - M* }5 [! n7 n& c _& R1 O
% G. h2 Q3 P4 `& o, \" q4 A理了理思路,重新做了一个测试。. g% G1 G9 Z; p: t5 W: F3 s2 u
做了两个 vector 和 两个 float *, 都长 100000% d6 n1 h5 L* Q- v+ w: ^
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 V+ ]9 D5 v7 E( ?5 Z8 t/ n4 `
/ q' V/ e7 p2 C7 ]& {" E4 K7 D
内循环试了4种方法,
" t' I m# Z4 L1. 直接调用 vector inner_product 247s
" {3 _: @! j- ^" ~* L2. vector 循环点乘累加 237s. s; q1 n" c: e+ a6 r: [
3. float * 循环点乘累加 204s
8 R: C( z6 y% W: T1 z! y4. 空循环 100000 次 202s
& \; D: z! P, N' W) A, i4 _/ m
- l2 L; ~. b" J9 F* _' `0 {0 W不做内循环 200s# j+ F/ `, }7 X5 z
2 l/ t7 r; c1 f6 G. Z* k
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 V8 Q: C. g0 Y; v+ C$ I另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# |+ r1 v( B+ l5 w* H
/ g: m2 @4 c2 i- E- }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)! v/ K) ^, W4 ?6 ~! @0 H
2 ?' G/ J; r# W y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ G4 g1 z; m- @2 N; J
1 g0 `% U @2 Z* k. g2 u4 V- _
std::vector < float > vec1(N);
$ @- V( y% O8 T std::vector < float > vec2(N);
! k" M9 Y e* A S( t float* b1 = new float[N];9 U' y" _7 T0 } T1 ~5 o
float* b2 = new float[N];! E. B) d) C C' y7 }0 |& m4 Y
) q7 F* I* r. ?6 {7 f
for (int j = 0; j < 6000; j++)5 \+ @- |5 h* c! B, y' h
{
2 K" `- f3 b r std::generate(vec1.begin(), vec1.end(), []() {
5 w8 L8 `) c9 `: Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' k3 c7 t3 Q. y
});
L& B, } K! j8 z1 `9 k. G! d) C
std::generate(vec2.begin(), vec2.end(), []() {
9 W2 ?5 O. g" E5 |9 j) ?$ T4 d; d return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; N( U5 Q. l) @3 E1 x8 \- n
});
4 U/ M, u" u+ l# r
0 @7 E/ h1 _: ~3 |1 G a- |# Y" _( j for (size_t jj = 0; jj < vec1.size(); jj++)
1 B- L. \8 i6 r {
2 f0 a0 | _9 G" \ b1[jj] = vec1[jj];/ j( G" p3 Z% P5 I
}
1 a2 H$ e! g5 J' }. w4 K: F& u! W( `$ a
2 z4 y, j2 B q5 n( f0 y for (size_t jj = 0; jj < vec2.size(); jj++)4 c6 f' ^) H1 j$ ~1 |5 V
{; ` S/ A! n9 x W2 L$ t
b2[jj] = vec2[jj];. E" k; y2 D$ q" }
}/ t- Z3 q- [9 b+ P" F5 f
% g- p, e8 J& ?; @ //Method - 1 N=100000 247s 0 H( T& d5 X3 g+ y" ~# Z
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 b9 E0 k6 z( ]
% }- X+ K2 h; [7 y0 z( c //Method - 2 N=100000 237s0 E4 M! y/ x. K J2 y- E
/*! R }5 Y$ Y4 D' z% W& `
for (int jj = 0; jj < N ; jj++)& N. l# X/ C& n+ l
{
/ Z, _/ I; A) F, s$ |% u ~ H+ C fresult += vec1[jj] * vec2[jj];. x$ \: z& d1 C' r9 e
}
2 l8 \& @" S3 a9 \ */6 k2 w' f! Z. E4 v J1 i1 m$ O# ^
* S+ l+ D+ H" \6 W) Q- E6 y
//Method - 3 N=100000 204s
; z$ y O) n$ B /*' ~7 e' T" m' j' p2 ^
for (int jj = 0; jj < N; jj++)0 ~" l# {3 J/ b
{
2 E( ~/ U* {) w( |' A/ a' Z fresult += b1[jj] * b2[jj];
) w* D' f1 x3 ^9 P( p% L% T }
7 t; u [3 X/ U8 E' p* y. m( n5 o */# J/ s7 q) a# U( `+ }
# I7 S. ^; l& c& f9 M' p //Method - 4 202s
7 v$ [+ c1 | F' \3 l0 _4 \ /*# f7 s) ]5 f2 _: u! v) s5 d I
for (int jj = 0; jj < N; jj++)" b+ J" W; _7 r& |, [
{& s$ ` A) ], n2 N
. |" L% c; A- M& g
}' A/ S' s# E0 s6 i- x
*/
* ?/ ~ J- T G- w. T4 C //comment out all methods, N=100000 202s
# K, }- m! Q. H }
& h q& x6 J9 T. G: [& B" {7 ^' N3 F. k7 @9 m
delete []b1;7 K$ Q# N9 M9 k: `; c3 K
delete []b2; 5 |, P. ^3 M' S
|
|