TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, V1 P2 q6 ]6 @2 T: O# Z, W5 C: [* N+ h
4 Z5 s4 z' N* }5 N' o理了理思路,重新做了一个测试。
3 O1 N! Q0 @' k4 Y6 _4 O- k$ L做了两个 vector 和 两个 float *, 都长 100000
; G% G! {# M4 o, o) T外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
9 X% f! o: H2 Q) l9 r& b! h* w8 a7 g! ?2 h( o4 R9 o4 R [& S
内循环试了4种方法,2 c/ C7 U# u. K* {
1. 直接调用 vector inner_product 247s
( Y; y0 z$ u* y4 b6 p* ]2. vector 循环点乘累加 237s% ~( S% L, X3 i7 E/ U+ k$ }
3. float * 循环点乘累加 204s1 Y& s7 `- A, P
4. 空循环 100000 次 202s& c4 p j2 u: I1 t1 N
( N9 Y5 A$ h( I* e2 |, [不做内循环 200s
& \' b; o; l% q% p8 s
4 d p+ N+ t; F你昨天说的对,内循环本身占比是很小的,大头在其他处理。" ?8 _; v; m% h5 Q* h* ]
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 b3 \* n* s. @2 J% T4 H( h) c% M0 u5 Z7 A% l
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 Q9 ^9 m9 r1 i' c* ~- e
9 ~# l$ ^/ @) P1 _" e) W9 a5 }9 Q- _) ?
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; D' w& R5 k8 e) b
5 y. ]3 z6 ]$ j: u$ b. W4 ?& e std::vector < float > vec1(N);
' p; f7 J6 G* h5 Z8 Q4 B5 Y std::vector < float > vec2(N);1 {2 X0 @; T/ R
float* b1 = new float[N];
: u5 f' \; o" K3 R float* b2 = new float[N];
. J6 L5 x6 y. T. k; k) A% m1 i. {& ^" e6 B8 X2 H
for (int j = 0; j < 6000; j++)
# j# N+ W' }3 N8 R& v {
7 t# P( N6 y6 z+ f( |9 v: G std::generate(vec1.begin(), vec1.end(), []() {
' u: _5 i# ^0 p8 r/ O; x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
; H: L2 ?$ J' i, Z' ^2 @* Z6 Y });9 R& M7 \% J4 i' }5 {
' T* L' `: l, q" ^ std::generate(vec2.begin(), vec2.end(), []() {
5 u9 F" b2 o& z5 p# s- I return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 a) a7 ?& W ?/ R" |5 B4 G4 E
});
) o/ H) f$ I1 O3 T v# e/ N/ Z- l: h- n6 W. Y" J5 R8 K
for (size_t jj = 0; jj < vec1.size(); jj++)! x; _1 g: }% _9 Q' ~
{
+ d/ l4 t0 z6 G% x b1[jj] = vec1[jj];
8 e5 r" O& M& l4 V$ F }
" f4 b. m% E. ?0 ]+ d+ V2 l. k7 o! c5 }5 b
for (size_t jj = 0; jj < vec2.size(); jj++)
0 M6 s5 g0 x3 e q2 [3 Y5 S" p8 E {4 G" n7 w" R0 P" n9 {
b2[jj] = vec2[jj];
) w# {4 g" D) b }4 ~7 {; t/ D" Q9 O" h) T% p2 c# j1 T
: ~3 c# L' W4 W5 G1 s, h1 _& E! F
//Method - 1 N=100000 247s 6 r1 O8 M0 {- c% H3 _
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 W2 R/ w7 w0 `- o( c
1 R: l* g. k% J+ _ r
//Method - 2 N=100000 237s) s5 k' p5 L/ s
/*
; Q/ C$ }( T) T3 H+ V* j' L for (int jj = 0; jj < N ; jj++)
. K* h% s( M# y" z3 n/ w {
- s) u( S) U4 T% G! z fresult += vec1[jj] * vec2[jj];
. y/ ?+ o: L3 A9 P2 b1 H }
2 @: T# }/ M9 h) O5 p% I */4 A X* j5 _5 p8 j# I* Z5 X$ r
7 |( L& @; M8 {8 M) ~
//Method - 3 N=100000 204s
0 i5 `& K4 L6 v* l- Q& n! i /*
' E0 k8 J5 e& v2 H3 p for (int jj = 0; jj < N; jj++)
. k8 `! C& V7 F2 Z$ _, y" P5 i {3 b0 n0 M, L# N; q9 D; V' U
fresult += b1[jj] * b2[jj];& |4 P, N* h- n5 R
}7 x c Y, z6 h% l- [
*/! X8 g4 v; [- m1 f
6 g% a7 N+ W7 |' R //Method - 4 202s
- c1 p) T) A L/ A: V' f# p$ ? /*
1 ]0 c* U# o; ~) ^# c/ Z7 k for (int jj = 0; jj < N; jj++)
0 ~. n [- `+ W$ C+ ? {
0 n; B" H7 C3 K: |7 U$ ? / s. s4 \/ h. l3 M) ^) A# S
}& d1 A( D4 ^5 S i1 ^
*/
( t7 b3 H' x& Y0 m4 c: C/ ^ //comment out all methods, N=100000 202s ; Y2 c5 ^& W& ^2 a9 j0 ]
}4 U1 |* T9 @ ]$ N1 U% h
1 b' ^# B1 @, }9 {% [
delete []b1;# l) @3 Y$ r4 ] ^6 E/ V
delete []b2;
; u; f% T# G8 ?1 u8 L) t- p6 v |
|