TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* T6 E7 W% }) p' X. f, }
$ e; M! ]! X8 @$ U% l0 J理了理思路,重新做了一个测试。
' Y3 ~2 j8 y1 r% c7 p+ Q* N做了两个 vector 和 两个 float *, 都长 100000
, C) e7 m. i+ W5 D& G2 M外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) F* E+ u6 E4 R/ w& b6 v
3 [& P- L* B) y- c) i内循环试了4种方法,1 k) V4 `& ^7 e- b4 W
1. 直接调用 vector inner_product 247s ! L. s7 A% w* Y1 H7 ~" |
2. vector 循环点乘累加 237s, i2 G: V( {6 E- S, M" b8 E- [- R* F
3. float * 循环点乘累加 204s
& \ d5 v9 M! _9 L, q+ T4. 空循环 100000 次 202s* \# R8 c. A1 D# r
, R! U2 A C3 N- Y. H: }: w不做内循环 200s
- t: X0 ]& u8 J- E! a( @; ~9 E" z3 M# Q4 }8 P9 _; B
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- J& n) V# Z3 n2 {1 o# q, e另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) b* w. A& B4 y( b3 j6 Q p! ]- ^4 c0 Z0 x
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
6 U' E8 M/ b( D' M4 ?" Z7 H6 s# O( i& E
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL) {4 | A3 I' R! G. ^
) U0 u& h; i! [* R/ c' T* Q std::vector < float > vec1(N);7 @4 j5 h4 q0 @/ B( Q# b! f$ ~
std::vector < float > vec2(N);6 p/ c4 S) N4 y0 R% b: G* N- m
float* b1 = new float[N];7 o1 M+ b' P+ s2 I( d' q$ Q
float* b2 = new float[N];
# {1 L- _+ A& u# S: `8 `+ \3 ^# e
& z6 G v! L0 V for (int j = 0; j < 6000; j++)
8 t# e) R& d1 X n {
8 L4 D) x1 B1 R3 W std::generate(vec1.begin(), vec1.end(), []() {
a& N, N& z2 L$ f- N return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 G* Q* E! A# ]$ s; M
});+ j- M% Y: r3 Q H% W' L: u' s" j
$ F6 u/ D! t- R" D
std::generate(vec2.begin(), vec2.end(), []() {- m: G, E# Q* x! y: V% X* x
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- Q& Q7 E- v! L });
. n3 l$ A }1 K% P5 D# A
: f3 K5 x9 H5 R5 e0 t/ N for (size_t jj = 0; jj < vec1.size(); jj++)
( d2 y1 g- i2 ]$ g X9 q4 l2 C {
# I/ @% H: j. X+ }1 R b1[jj] = vec1[jj];- k9 q+ y7 L7 t H% t
}
. X1 N, Q( [4 y- [
# J% V k5 l5 [4 f) J3 E7 B for (size_t jj = 0; jj < vec2.size(); jj++)
. _0 U/ G- z, R1 K+ F {
5 `& M, |; c! G# E8 m6 K b2[jj] = vec2[jj];
2 ~( U. ^% g7 y }
1 _( C; u; H& L, Q
" Q6 Q; Y, r' f" X+ E& H$ O //Method - 1 N=100000 247s ; Y& S- o5 @8 X
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
# A7 |- w; p* w7 a* Z+ x7 l" C 4 m! f; K2 A9 y) w$ }) M, j
//Method - 2 N=100000 237s
1 ` s6 ^6 i( r! y /*
3 B1 W3 a: H8 N; e for (int jj = 0; jj < N ; jj++)+ u9 i0 h. y0 E- f% S3 {
{
3 e- @( v T% Y/ S1 I4 o' l4 h0 u3 E fresult += vec1[jj] * vec2[jj];
& |8 @+ i0 Y/ i/ g }1 m' T" p# v$ H- I6 ^$ A
*/% a+ m C& a' _% `# w, a: \- B
, q/ F8 v, Z [ a/ N' e+ Y1 A0 z //Method - 3 N=100000 204s
- y7 Q0 v8 H: I( w" e$ _8 G /*
3 B. t2 s: {$ p2 E+ d+ g for (int jj = 0; jj < N; jj++)
5 V; k( w* D2 C0 A {
2 @& v2 X; B5 o fresult += b1[jj] * b2[jj];
; r6 Z; _. i- n) a }
$ ~* x6 O1 O5 r/ p: {% z */5 g. f% {7 b, Q6 {
9 v( F' z R. q
//Method - 4 202s
) H# u) T1 H6 H C g /** ^9 h O0 ]# M/ ~. J; w
for (int jj = 0; jj < N; jj++)
$ ] M3 F6 n4 J4 U4 L {9 b0 m* p( d; c+ P, [5 s" C6 K; _/ |( }
' |6 n$ n# z' F' w5 z. `, B7 F
}: B5 G' d! I- v5 ^& \
*/1 d2 ?! z Y) J, L
//comment out all methods, N=100000 202s ; S5 J( n8 |' Q
}
3 O6 |7 g1 U3 `% U4 ]& Q5 y
% C; T0 V2 n3 p delete []b1;/ ?. y% E- A3 G/ l- ]$ i' R" M) U3 ^0 a
delete []b2;
- \* G8 {7 ]. V+ z& \ |
|