TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 , N2 L1 j- x% f
) p+ B( S" c# N3 C0 K理了理思路,重新做了一个测试。1 Q: J" T/ H0 Z% W
做了两个 vector 和 两个 float *, 都长 100000
/ \2 @# G; w0 |# T外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( @; _! @8 y v- [5 b) E) F
7 {/ z" x' v' t- b$ j) N: X0 Q
内循环试了4种方法,
E; I! u- S" v7 s4 G$ o1. 直接调用 vector inner_product 247s
1 ]' g7 O A) [, S8 M2. vector 循环点乘累加 237s7 O( n2 q0 ?$ o( O
3. float * 循环点乘累加 204s/ M- w' ^4 u/ T7 _$ N0 R: {
4. 空循环 100000 次 202s8 `( ]- c# a( c
/ r4 K- A% u% Y2 Y* h7 v
不做内循环 200s( j: i& }* d& J/ v4 m/ D( o7 {
# U) n! m. N. A2 _. P( K你昨天说的对,内循环本身占比是很小的,大头在其他处理。
. V" H( G( U2 _1 F/ a# W另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
' |+ S& L, e6 R' G& I! Y% p) _' e- C! a( Q7 b$ c: r
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
2 r$ `- W. D0 P5 y f4 K
& y2 `7 g9 E7 W6 `' w(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
/ S7 P$ _: Q& R* w% ~; w' C9 k2 d" w% ]( n+ n
std::vector < float > vec1(N);
1 b1 v/ D# d0 A( D M! Z7 D/ Y+ I) C6 T6 a std::vector < float > vec2(N);- K0 \, z$ U+ q R8 l: `( b( E
float* b1 = new float[N];! m3 j# r+ r" R7 N3 D5 V+ I
float* b2 = new float[N];
W ~* `6 i0 u' F0 R. g- r6 r+ `0 h* ?1 O- R
for (int j = 0; j < 6000; j++)1 Q, d% A: J! r5 Z- T
{
9 y* U3 S5 o4 A6 M3 v std::generate(vec1.begin(), vec1.end(), []() {2 j+ R, _( Z! J
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ b4 R' T7 K- w8 Q });
; w7 f6 X4 l( A4 `) }! w( ]6 Z; G; ?' {: w9 l/ \1 u! K
std::generate(vec2.begin(), vec2.end(), []() {$ N1 b) i2 a: c! `9 G( i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, e) w% V% T( C" {
});% D' U# ^0 y: r% e p- A
* r3 w- x* V6 \; ?
for (size_t jj = 0; jj < vec1.size(); jj++)- H- D2 \- K4 Y
{8 `) M8 `$ r2 s1 j u' v
b1[jj] = vec1[jj];
% n' Y% M* { I, V, V5 } }+ |$ h% L0 C9 C" Q7 {- i: \3 p. ^
, D/ }6 Y/ O' i7 u
for (size_t jj = 0; jj < vec2.size(); jj++)( g) u9 R$ W" S% M, U3 g' \' [
{
1 c: v( N+ O& J9 A/ ? b2[jj] = vec2[jj];
?- ]7 P3 G3 _/ ]8 K }! T" R7 Y6 c+ x3 S4 S- S
+ I, I; I+ R B4 L! V3 N' `/ ^ //Method - 1 N=100000 247s
) r2 W6 Z/ @* l7 ^ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, W5 i. c5 ]5 g" t/ _4 h
]7 G7 p# H, k2 {6 V# t //Method - 2 N=100000 237s
9 x1 M2 v4 e; `+ y7 I7 z" {" r9 h /*; l; L( o& O/ E% F+ V1 ]
for (int jj = 0; jj < N ; jj++)8 Z+ _* X( k( s7 K" l' U& Q& r! w
{
! C0 y0 J+ q' J4 \3 t fresult += vec1[jj] * vec2[jj];6 P- t4 n! Q/ p5 A
}
' v4 d, M- U6 n */7 t7 d( \& { g
7 Q2 y1 Z* j+ E9 i0 s5 y( R6 C //Method - 3 N=100000 204s' v# E s, X ^0 D3 ~% P- C
/*2 Q6 f( h) l3 I# O. ?# i
for (int jj = 0; jj < N; jj++)
! J+ [& Q1 Y! B7 _" g# V6 k {; C6 R) a2 ~. j* c+ J2 e) }! e, w
fresult += b1[jj] * b2[jj];
0 e) A/ \. z8 n, V' H }3 y% Z1 r2 x& S" U
*/* m+ \" ?! M0 ?2 B+ Y; w
' k. L. \0 H- A5 m) t3 l1 W m //Method - 4 202s9 T% n4 N n) t2 e+ E# f, O6 f
/*7 |# f: k; t6 N/ D* Z8 ?+ O; S8 W
for (int jj = 0; jj < N; jj++)
! D B5 t* r' Q' M4 ^ {
! n! C! [- B9 d
4 Z, j. U3 Y' d }' \# M# o. \. a! v9 v
*/! |9 H$ {- s& p" B2 l; y' A
//comment out all methods, N=100000 202s
5 j+ [: f3 S, j% q* t }- e s2 a- M, x' \: e
) g3 ]. P) ? ~3 w/ N0 D$ s
delete []b1;
) s" Y% C4 m' j# z2 d7 G% _ delete []b2; % n; f8 Y# p0 ` r# t% w/ m
|
|