TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
& H9 m; ?2 u$ {
, e O8 ^0 S) |- u$ O理了理思路,重新做了一个测试。
# z" L7 F8 h3 Q5 f( N做了两个 vector 和 两个 float *, 都长 100000 ^# h' ]1 `) m- Y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" h9 @0 Z, K4 B
; s. \2 ~" |/ w; `( }4 E: G& W内循环试了4种方法,) i1 [2 t7 v) y) r' F, }0 N- z) S
1. 直接调用 vector inner_product 247s
, q- {5 W& D1 a8 K' Z% P. v7 E2. vector 循环点乘累加 237s
! j6 {8 `8 A* h3 @3. float * 循环点乘累加 204s
% Q# c* F$ a' h. G6 \4. 空循环 100000 次 202s
3 a1 @3 k" j- }# r$ }0 U$ _. t+ ^3 ?- m1 |
不做内循环 200s
4 F. M) C1 v: p+ H) W/ n' s! ]9 }8 M0 _9 P$ T4 k
你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ x- p$ O" N2 Z4 z ?
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& u/ F/ J2 ^& m0 S P7 Z1 P! E3 I, \+ Y+ ^: R9 |3 @& e, p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 r7 X4 d6 `; R5 s3 W" ~
& Q3 F: S2 S5 t3 {5 c
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)8 e3 K0 x. C6 f F" j" E7 a
7 o' f4 K1 s) n$ @+ O0 c std::vector < float > vec1(N);
4 l5 @, Q( B9 I5 C$ E std::vector < float > vec2(N);
* H! ?8 W7 f, D5 O5 O7 k* x) N float* b1 = new float[N];5 C$ q8 f* l7 U* D
float* b2 = new float[N];
; p% G: `" k" \4 A1 \2 A6 w! v+ ]4 w* V7 s7 I! A3 {3 e4 ~
for (int j = 0; j < 6000; j++)0 w( w, h4 {+ l" ~) }, h) D0 \
{
" v2 x! y+ I# j5 O; l std::generate(vec1.begin(), vec1.end(), []() {* D Z# [! G! z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
: E( j7 V$ L1 B3 l });
: I3 p3 z+ {) S2 u+ Y- l1 W# Q1 @' E4 l$ p3 i
std::generate(vec2.begin(), vec2.end(), []() {1 z( ]$ X" h5 W) w! U' M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# U- z6 o5 L1 k; q
});$ k$ ~% b. O: v) C
8 T( w2 n/ @3 y3 {9 h( r! D# f for (size_t jj = 0; jj < vec1.size(); jj++)# o8 J* o6 R/ R& P8 Z9 G$ }
{1 s: s8 I/ a; M& o! g6 t0 B0 u
b1[jj] = vec1[jj];) j0 U1 m9 z4 k4 o% a- \' g2 g
}7 s. A7 ]7 Y8 D# i; \0 }
" y+ U5 d$ ^/ L1 i+ C! R0 X for (size_t jj = 0; jj < vec2.size(); jj++)$ [( `! y7 r, o
{
8 g- [# q7 T& F4 I) F# Q# @9 u b2[jj] = vec2[jj];
5 ^1 w1 f* g0 j3 c7 j. S8 z# t }: g2 ~" o3 J7 m. m; y' D! m; _1 T
4 i( P0 l+ R4 f( _; @% G7 T! H //Method - 1 N=100000 247s i( W' r# P5 @# k4 n$ f
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( I% ?6 O ~9 K( g/ ~ 0 x, P3 j4 M! c ~4 l* ~
//Method - 2 N=100000 237s
( V* u9 K/ ]- h /*
. ]2 k, p% G4 e5 c. _# k for (int jj = 0; jj < N ; jj++)9 z- W) w( r7 _% g0 k! g
{
d* c o" i7 z" f; ^ fresult += vec1[jj] * vec2[jj];1 _4 }- ]& {& G, j
}
; W% y. O o! T: Y0 F */& i8 L& ?" J6 Y6 u
: Z3 r( a6 R) S2 z
//Method - 3 N=100000 204s. v) k; T4 y. |- ?; W2 C
/*
" |9 g W; A/ o for (int jj = 0; jj < N; jj++). F5 D# i" j* o' m0 O
{& I2 M) c$ w% {, I, n) `8 ^
fresult += b1[jj] * b2[jj];
( J) E0 r9 M- q+ p% r, ~- L }9 _& z- z' I* \- G- k6 P
*/
/ s5 X" c N' [4 C6 I) q8 u5 V# d
8 h" o" R2 m* S4 | //Method - 4 202s, U: X! k( o( p& h- N
/*3 b2 `0 p: a0 N& F
for (int jj = 0; jj < N; jj++)# j; j. z1 F: i! j; P% s
{
% D' c/ ~+ U/ e9 z$ j# [% B/ S- C
1 s: L4 }+ v, ^; E }, w/ M1 Q. i+ Z+ w
*/$ R# F F- {( l4 U- B. N
//comment out all methods, N=100000 202s
; b( O3 S! b% G( ]- A }
9 C$ o, U" H9 G- Q& ]) |3 s7 w* v; ^& ~( c4 [
delete []b1;. s- i! w! ?5 }' `/ u
delete []b2; - w8 X# S; [2 k2 f3 N2 W2 g
|
|