TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
; Z" `8 U2 O. h3 z: ~4 A& _) W" T: x" D
理了理思路,重新做了一个测试。
" |$ h6 |$ b: g5 x- E做了两个 vector 和 两个 float *, 都长 100000' [# G- X0 d. H, [
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 }# F9 a1 f. H/ s
N0 _- ?; L e' G( @) k7 O1 u& z内循环试了4种方法,; D" y) u$ y3 J% |9 i9 n/ R
1. 直接调用 vector inner_product 247s
$ x6 {; H5 K/ v2. vector 循环点乘累加 237s
) V% k% M' x2 U9 H2 M5 K0 r! X3. float * 循环点乘累加 204s2 L% Q# ?; k- {' A% e- ~6 S
4. 空循环 100000 次 202s
* d% T" `" X+ x: G$ u4 |; G4 n9 Z. }" j0 o6 g0 x1 d2 j
不做内循环 200s
1 S) h9 t5 L# N7 X. g6 u9 w B0 k
4 T% ^- I, E! R, f7 e/ [你昨天说的对,内循环本身占比是很小的,大头在其他处理。
" B7 B1 W' v; V$ e另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; G; g$ j& H0 }$ M1 t
; \$ Q/ g( T' K: A至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% T6 D6 U. x- n3 ]/ ]9 ~
2 b. ?- j! h8 U; q% l9 w(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 m2 I: c/ L. B. k- E" O: ^4 ?' b
std::vector < float > vec1(N);8 Y: J+ p5 q. O- ~* q3 B( L
std::vector < float > vec2(N);2 k( s% A9 K3 x4 g" _$ Z
float* b1 = new float[N];5 n; e, @: r' z' A
float* b2 = new float[N];
9 {0 o }3 B/ {8 @. y5 I. O; d* x5 Q" o |" N6 `% r( e7 P
for (int j = 0; j < 6000; j++)/ ^ d5 v* W( m( k, r7 s# f; r
{
) Q: J; |. g2 h4 u std::generate(vec1.begin(), vec1.end(), []() {% N! x/ H, n3 z9 a) b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 O% G8 l; K- ]1 W; p0 @$ {
});+ J" |) C! K7 g0 ^
* s" W* @8 l. n- k std::generate(vec2.begin(), vec2.end(), []() {
7 r) E3 B$ s9 m return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; G: x, e8 @( v
});+ _. C' F$ a! D9 F2 f
4 A5 W! i* N& k" p) G0 I
for (size_t jj = 0; jj < vec1.size(); jj++)
' t& W8 S7 r, C* m5 P {& d; B, }* O7 B4 A$ Z7 x
b1[jj] = vec1[jj];
* H+ q+ ~4 F3 Y: O/ y* T% P# P }& K( D& a% ~. K
2 X, I/ T* e* G+ R8 v7 P; L9 q
for (size_t jj = 0; jj < vec2.size(); jj++)8 X/ Z% T, N0 K" G2 ]
{) d/ `/ w" u5 u' r( ]9 s7 U% T
b2[jj] = vec2[jj];
# V& R$ W( ?( g. A0 w( R4 V8 s4 e }. p( V$ |' [( a$ F) e
9 i' X0 }; u- D- ? //Method - 1 N=100000 247s $ Z% r1 u5 v* M) a# |
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
! D6 _! F% T8 M" E6 n0 y : ~0 L5 W( D: ~# ?6 d
//Method - 2 N=100000 237s
( }* f. g8 L! K) f* w3 m /*
* W- P% g* X2 A* b* z' ?/ `& g9 q for (int jj = 0; jj < N ; jj++)
$ }( Y% q, `( z% b& f3 h {
' g# x5 [3 d- E fresult += vec1[jj] * vec2[jj];* L$ D5 N1 M" W6 W
}/ t! O% Y+ w$ t6 q
*/& J5 k% [! H4 z' b
: Y; q/ c: _0 q q$ T1 D7 W2 I
//Method - 3 N=100000 204s/ ]4 G5 y* |7 \4 y% G
/*$ m1 u) t/ S& F! o; [
for (int jj = 0; jj < N; jj++)9 s! g t7 W( x4 }2 U# `
{
( \. _3 e8 F5 m% U7 \ fresult += b1[jj] * b2[jj];
5 _( ?# ~- v* u' ?) s }
* [8 b4 M- N2 Z1 e */
( }& H' D5 w$ K: i/ R% g9 ~7 C# d$ e4 g3 C! g$ X" H
//Method - 4 202s
* G" h# u7 J7 |- K2 ]4 r1 R2 E /*4 G) C0 K* s( z% J5 m2 S
for (int jj = 0; jj < N; jj++)
6 U z. T' U2 _) ]& j+ @2 d- t5 n {# C) `% U4 d* ?# Q8 t0 U7 c) d
- n! _& S; _$ n Q$ j; T ~5 h
}/ C; g2 H8 N4 C/ ~9 f* j
*/* @, N& Q% y7 J/ x$ N' E( O3 T7 C
//comment out all methods, N=100000 202s
+ Z/ r- a. @" `& b9 Q. K }
, K; `- Y; N, }8 T" r
4 [! {+ z9 ^6 q delete []b1;* d1 P! `) p9 g' M" b& N
delete []b2;
. y. ?3 @: ?7 H! o, N) `( q |
|