TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 " f$ j7 v) A" N h! R
! M4 O4 X- f3 ~) a" Q) K5 y理了理思路,重新做了一个测试。# n: s6 g+ r' W; h3 ~& h
做了两个 vector 和 两个 float *, 都长 100000
( X J% r$ e) E7 e9 S外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* f [) w% F$ o$ w' W( u" ^8 |
6 \9 l; S! D: X5 R, m; I4 V内循环试了4种方法,
/ ^ B+ ^ r) j/ u1 g0 y# T! o1. 直接调用 vector inner_product 247s
& L: s& h1 R# z6 k) m( _2 `! w% @# f2. vector 循环点乘累加 237s
) r# `' X# K3 }0 I* q7 q3. float * 循环点乘累加 204s& v) n* P% R8 R9 Y1 `3 g
4. 空循环 100000 次 202s
2 t- O g& F0 l3 G! ^9 Z
; @# S. r) p: i+ U$ t' m/ t不做内循环 200s
. j7 A* D+ ~+ t8 J+ o$ i$ r' }- }
1 p/ K' F9 g% P6 z0 o你昨天说的对,内循环本身占比是很小的,大头在其他处理。% V5 [# H" y/ J# }; ?* \
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 R% y, }! b) w; ?* L
3 D! l1 l2 u2 b; a* ]至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ ?$ m! b' \. \: R$ s! u2 _
0 r" B9 J( ?" h- v4 a(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
' ?& U l0 l/ G$ Q+ m
' ]/ ]4 f* e" h/ h std::vector < float > vec1(N);
& g1 K' ]" T7 H$ H( y- E! l, k std::vector < float > vec2(N);* t9 r- ~. @) Z2 H
float* b1 = new float[N];
0 Q* }1 I) U8 `2 l float* b2 = new float[N];% U ?, \, h) K
% z4 A& R5 T4 M c' J
for (int j = 0; j < 6000; j++) s7 {! b6 i; J& ?
{
7 K# y; x" L& O1 {- O std::generate(vec1.begin(), vec1.end(), []() {, b- Y9 ` G3 D0 x3 s( |) _
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. t/ T# n) R8 k( Q9 E });
, k+ m! W; U8 h3 G& X; g* M" p! B% |# d) h9 q& |' m! S/ o# X: t; u
std::generate(vec2.begin(), vec2.end(), []() {
$ I7 @; s& p) J0 a# H% D return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
% z p) @( x8 M! i/ W });- _; b% [' @, }# x4 X4 v
+ C+ `+ s/ d4 _4 g6 ]8 Z2 A for (size_t jj = 0; jj < vec1.size(); jj++)- q* f/ x# x7 v0 P7 m a% {
{
2 ]& b5 f2 b! r- m k {7 \* S b1[jj] = vec1[jj];: {1 ~( n1 n! \. K
}) @: ~$ t0 l- {' E( y B
8 z) O- d, J, Y. e) b7 c
for (size_t jj = 0; jj < vec2.size(); jj++)
! ]6 o6 y3 T1 b% u+ _ {
/ }' z2 E0 j' l" }. s b2[jj] = vec2[jj];
6 i7 O% o+ Y; N8 M }2 k" O4 Z* Y7 Y
# X/ ^7 B5 N9 e8 ?; {0 c //Method - 1 N=100000 247s + `$ c" {9 t8 s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% S% |3 s+ t3 C0 a( S+ v {; h$ w
/ U* _; i* J a; Q //Method - 2 N=100000 237s
1 u" @( q# B4 V( G. a /*8 V' v. e! Y3 e- n$ M1 z
for (int jj = 0; jj < N ; jj++)+ N; ]" |0 Z* n+ O t
{+ W1 A7 Q0 @& [9 ~0 a1 g3 k
fresult += vec1[jj] * vec2[jj];
2 s3 `9 Z: f% W1 T! f }
1 n+ Q$ @- p% x" L */
" P- I; S& A2 q' ~, w' w
`3 ~3 w0 Z1 O4 U3 P8 n //Method - 3 N=100000 204s# e2 I/ x3 U' N1 f
/*
9 [1 d* n. N- ~& a$ T for (int jj = 0; jj < N; jj++)
$ z7 u- z2 C, s# K9 F X T; Y {9 J" N, A; R# U9 k" _: h
fresult += b1[jj] * b2[jj];
* G6 J* L1 E# P( s4 m$ M" D$ D# g }
3 a; r" H0 s/ n5 \ */
2 C; @- }2 A$ T; A7 }3 x8 {8 `* [
//Method - 4 202s
4 M7 B8 i& |1 l* q# R& N /*
. [. n( z3 w+ @: t; ^4 v6 r8 U for (int jj = 0; jj < N; jj++)
r9 B$ _5 D# o/ Q. }7 M {
) h' J, P( A! X2 z. H + ]/ \! M% E0 z) {" ^ p. h" _
}( B7 u. J( o7 C9 I8 x
*/4 Y, X2 a0 o! L5 D' D* |
//comment out all methods, N=100000 202s . h% [* |6 V$ z0 Z, Q; N" _$ T( e
}
( {* ^5 b1 q- Q/ B6 a0 h
6 A$ o9 m6 a) z& G% |3 {% e# z delete []b1;. U" ^1 b# m+ K
delete []b2;
q) y( d) z. D5 l |
|