TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
; K5 J4 W. F) T \
9 v* ]' R5 T5 u6 _& u6 b理了理思路,重新做了一个测试。
5 c) N. b, J9 A/ u; f6 X/ e做了两个 vector 和 两个 float *, 都长 100000- Q `! d/ p1 V& E$ l
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
/ R1 @2 W) A/ [' c* [' A$ H- m7 F8 O( L+ |
" r0 v5 Y7 U; n( {* {* G* r内循环试了4种方法,. b0 X$ G, ~" H( s8 T+ g3 ~) D8 i* R$ G
1. 直接调用 vector inner_product 247s 3 G2 _) J2 Y9 Q6 w% M* Y" U
2. vector 循环点乘累加 237s& z* V; h6 H2 v4 K, u
3. float * 循环点乘累加 204s& H, t9 M+ v3 o
4. 空循环 100000 次 202s% }1 C W/ j, p- ~% \
, C) N. a6 d( F- Q9 U' [
不做内循环 200s5 B/ j% z/ M/ F
, _- I0 B9 I& p# h5 B$ D" J7 B你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- J0 {* l) \( |/ j( }8 a: W: E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 |3 K% P* I$ X6 N# T' ]8 C& U! V3 z- m o- o3 a
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 n9 {0 }% ]* y0 b
+ `( z5 `3 }2 \, h8 b& J( o" r
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* {& t- `9 I' Q1 A: U* K( \1 _
* [/ |, b$ |& V# B% C std::vector < float > vec1(N);- a9 C4 c8 ]3 C4 s y4 }$ F
std::vector < float > vec2(N);* Z; [! E- f: Y7 F
float* b1 = new float[N];$ [& w( A( ~8 C0 v- ~( r
float* b2 = new float[N];6 M- t* G, \) Z# _ e! N' A; R1 @
% r" i1 C0 E1 M( k' \ for (int j = 0; j < 6000; j++)$ `5 V! p' j) `6 C) V4 o! N6 E
{
8 i x) V B% I" F9 R/ ~ std::generate(vec1.begin(), vec1.end(), []() { V' }7 W: @5 e5 H- h) A! I$ @
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, ] n! d! F+ N, T% d0 M% d
});
5 s9 ~7 U `( D9 |, Z/ s( n
! b8 ~ j* W8 @# H std::generate(vec2.begin(), vec2.end(), []() {
9 ~2 I. L, r/ i; i3 ~ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;% z1 }8 \9 n9 G! V
});6 \& k, X" B% J- ?. j' f: f
7 |2 I, r; ^8 S A% U. i4 v; P for (size_t jj = 0; jj < vec1.size(); jj++)+ @- K* Q) N( j# \6 N
{
, |) f$ J# S, D" T- D" ] b1[jj] = vec1[jj];; a' Y a2 {9 C2 P
}
' C- }( k" M4 G' F, @& n7 t% t( E
for (size_t jj = 0; jj < vec2.size(); jj++)
1 Y) i' k, Q5 T8 W X% _+ C {% k, F3 F* I4 O5 D! O q$ R
b2[jj] = vec2[jj];1 V5 Y8 L* j) S- E: Y7 |
}# Y+ [( g8 z2 \& Y1 {4 E M
3 ]2 L+ n2 z+ g! E
//Method - 1 N=100000 247s
, _% E9 b$ ?4 \7 J //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. l; i1 _' n$ v b3 E( C
9 a7 u: u( _# O$ M5 R& ~. Q& w! P //Method - 2 N=100000 237s& M0 f3 Y" @0 d* C+ C, P4 Q
/*
. l3 r2 k1 R: j for (int jj = 0; jj < N ; jj++)( o/ C' e4 p( D5 b" ~! t* k. I
{
8 j1 I, _- i2 r fresult += vec1[jj] * vec2[jj];
8 _! J; P" Z2 y }- l" q; f" b- {6 I* R
*/( Z' I9 e0 q8 R* y- t7 a5 Q* M
( W" }; c8 Z& g2 O3 i, d //Method - 3 N=100000 204s
3 T+ s: n( \4 f+ q3 P /*. v# A; Y% K+ l" D& \3 Q
for (int jj = 0; jj < N; jj++)9 X B% d1 k/ f( ]. Q: r7 c0 O
{
7 ^( U) N7 D. G fresult += b1[jj] * b2[jj];
5 T1 {+ G; v+ ?5 B }
8 }+ K) X7 w' j/ W K8 H" u */) |- j) |' Q3 V U9 Y# z
, Z8 R9 B" P! q# V( S9 O- H //Method - 4 202s8 H: W/ J; {/ F8 C
/*
! k& k: o) B! I6 g4 U: G Q for (int jj = 0; jj < N; jj++)& m8 u6 E6 R# b: `; N# d
{
; g! O1 I A: M" ~* o5 M1 A+ F: E & t' d+ H& ~6 }. r! R" Q
}5 g3 k/ v) L8 U _
*/
- v d f) U* _) P //comment out all methods, N=100000 202s . l/ O+ P, ?# b7 d: x" d
}
- s: x8 H9 C8 S* J5 n0 H5 w$ S# D9 M* d! g# w
delete []b1;# j3 A$ O; `' A; j6 C. Z# ?8 ]5 p) \8 t3 W
delete []b2; , X( u0 x7 A, k- y4 K6 y
|
|