TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 ^( ?9 ^1 A2 w9 f- P& t. s
P: |8 @5 f. \+ Q" z- a
理了理思路,重新做了一个测试。5 Q5 Z1 a/ _' r8 {# u. }. @
做了两个 vector 和 两个 float *, 都长 100000
/ K7 q0 T5 h o- c- P% [. I- ]8 L外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ p6 G- t: H: {! x( `: {4 U- ?- j9 H+ L, g' C
内循环试了4种方法,
" g( B+ e3 |% c" W# R5 D* e$ s1. 直接调用 vector inner_product 247s
9 s# E* z U. O( n6 I0 f& o" t; S2. vector 循环点乘累加 237s
9 A, ] M p# o# K0 }* X3. float * 循环点乘累加 204s6 u7 y1 a, N0 v' {
4. 空循环 100000 次 202s
6 d1 x" V& b% X4 j0 y! P" U/ ~; Q. x# C- A
不做内循环 200s
) h5 ^( a1 O+ Q' V
/ ]2 D1 _" r2 h. A' t# e你昨天说的对,内循环本身占比是很小的,大头在其他处理。
" h, `) D& N4 p* ]( m另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 e$ Y7 S8 E8 @ H
, u4 B2 X: ~8 Q7 O* ]' l6 G! g
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" a' \5 y" r: [5 @7 R9 H
! R" B+ Z1 Y h" F+ O$ i: z(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% E6 @. m5 F2 M+ J# O9 p7 N1 ~$ Q* x m4 a. g4 |
std::vector < float > vec1(N);$ C! E0 m; Y3 @! y; M0 F
std::vector < float > vec2(N);
# g. A! {: [2 n0 X. |8 [8 q float* b1 = new float[N];
, u M( `1 j0 r7 B float* b2 = new float[N];* Z# J t3 A& y% x# h0 ]
' |( c; |& w# Q3 t* ` for (int j = 0; j < 6000; j++)5 G+ i& n5 V7 T. V* r2 O
{# U% R7 H# @; v& u6 E7 I" T
std::generate(vec1.begin(), vec1.end(), []() {
0 ~$ J5 U M! F+ B! k: G# o return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ o4 g |' M: f/ N/ u: u
});. {. z0 [, j6 } E& P0 w6 b
: g p" p& B" I5 d) p std::generate(vec2.begin(), vec2.end(), []() {
2 J& x. q; A3 C1 ?* ?( s- \3 ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
" @0 U5 r! t$ P8 |2 N });
, p: ?! y; g h4 f6 u! p+ B' M( i
" V6 N' j& m+ |: l# K5 t% m0 o for (size_t jj = 0; jj < vec1.size(); jj++)
" z1 F$ S% g3 b" t2 E {
9 k$ q% G* Z' D3 y. U8 d b1[jj] = vec1[jj];- \7 S3 Q! S1 U, Q6 v6 Q
} s2 r' l" T! q) T0 A
8 B( C2 k/ _2 a" |( v: W
for (size_t jj = 0; jj < vec2.size(); jj++)" d7 w8 L# D" T. y- W
{+ D5 z! r, H# |
b2[jj] = vec2[jj]; `7 v0 Y& _1 P* I: C0 z7 R
}) Y7 @) G9 P6 U( R1 C0 j/ N
. V9 T# P& n' y //Method - 1 N=100000 247s / I k3 p/ F, N3 w# H; K4 n" R
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) {- c! R3 {- p$ F+ k' Q9 f* T* W7 |" F
2 D- k8 l0 B0 w# i! P( d4 d r //Method - 2 N=100000 237s
+ G& D0 s4 R8 r2 t* P! V /*
- Y0 a" X5 T u! m g9 T* Z for (int jj = 0; jj < N ; jj++)) I$ s0 H: J# V. P( {8 X
{6 ?! M4 p& `7 f5 i7 ]% F
fresult += vec1[jj] * vec2[jj];
" c$ u- l7 k; e2 X }/ J( @4 t# L$ V. r6 h4 G3 P
*/& k* _8 b# }3 ~5 [
" z3 m' d6 H% p //Method - 3 N=100000 204s3 J w" b4 F$ |- i- F V; N
/*
9 j5 c! U$ g/ }; s( k0 e/ e for (int jj = 0; jj < N; jj++), d% t0 @# P0 A) m7 K2 J8 e
{1 H/ l" C2 C0 d% e5 k" y3 E
fresult += b1[jj] * b2[jj];
5 W5 I: T6 u6 \8 y" o }
& U, h/ ~. Y# }2 H */( O/ F" s" K4 m# u: P
9 E+ G0 g) o$ h& V1 T, k6 v
//Method - 4 202s
5 `1 T" b- K0 m& \ /*& j- u+ T( v( J
for (int jj = 0; jj < N; jj++)
0 f' J/ `2 [/ I$ |( @9 a {
4 P- Y: g5 n; W( }5 H, M' M' |
4 L! Y' g+ g+ Q% N1 I }
5 K$ h0 [/ B" ^( h* }2 i */
$ \4 \5 a/ Y2 u- S4 R/ W2 A# j //comment out all methods, N=100000 202s
- [1 Y3 \6 n# p* h }9 f' Z% b# _' w& q S9 b5 Z+ u
8 r9 y, Z( O) ] delete []b1;- _) z0 J6 o, }
delete []b2; Y) c/ r! u) f) o7 K3 `- l) J
|
|