TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - J0 f& J) T+ [2 R
; L) A1 S9 Y4 H
理了理思路,重新做了一个测试。2 b0 U, ?9 w9 l( d/ f" f# a8 D+ r
做了两个 vector 和 两个 float *, 都长 100000
3 \/ f" J4 _- t/ q; a7 _8 L0 g7 n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., B! f1 Q l5 C8 |+ p
" H' W+ ]7 ]4 f4 \1 Q* p* n, m+ e
内循环试了4种方法,
) B- B5 {. M) c+ v, G: f$ t* B1. 直接调用 vector inner_product 247s ; H5 p! s$ D+ U* j4 Z$ m
2. vector 循环点乘累加 237s
' Z, E9 z$ U) S* x8 E. j/ X3. float * 循环点乘累加 204s& @& a3 ?2 C" y# c* O$ [
4. 空循环 100000 次 202s
) s5 L/ Y$ {; W9 w8 s% I N1 b$ B( c' v+ W t& i: x& j" t" F. B2 R
不做内循环 200s
$ @4 ?. {" y$ S5 U) F# w" a' V: h! e% l$ |6 J
你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 [8 c4 i z" \$ c1 q8 l8 s& i
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& S- G; E5 z; j3 d8 o6 a" e( P7 i5 C x" ^
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, i+ u" ~9 w4 k4 ?$ t: w, j; V
- D4 x0 c ~! K7 m7 C O(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 Z2 n8 Y& @3 D$ G+ i( e, A( x( F Q7 D( j
std::vector < float > vec1(N);+ R1 C7 r# v2 S: u" W
std::vector < float > vec2(N);
/ q6 _' n1 s5 \/ m: n. E! _1 D float* b1 = new float[N];
% R# v% n4 o; h% a float* b2 = new float[N];
! d O, Q5 p& w3 c
; ?1 K$ _$ o2 _* e. W& X' h for (int j = 0; j < 6000; j++)/ t- ~) }' ^- E! h: @
{
6 y/ r: r- S+ H2 N8 b std::generate(vec1.begin(), vec1.end(), []() {
4 b3 [! p# h! H8 x# V6 R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
1 |, p7 u; s; z0 E$ x% W });8 k j" H5 d* O
& x" J' x$ E& U. g' s6 Y
std::generate(vec2.begin(), vec2.end(), []() {
h6 r- Q% i% ]# |1 n) h return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; ~. w1 t- c! b0 g- y4 @ T });
4 D" S, L+ Y4 E) g: ]8 B2 P
1 d3 b, s3 \& {1 ]/ u for (size_t jj = 0; jj < vec1.size(); jj++). D& W6 ]# ]# \$ a6 }7 r. q( }% ]
{
# x* S( g% S2 w0 u/ L( s; L! ` b1[jj] = vec1[jj];
0 L1 H! C( s/ y$ b. {' l( C }
6 _" H; i- ]; k3 A3 g* J: H! i% e! @* l; M5 v; I5 D
for (size_t jj = 0; jj < vec2.size(); jj++)* A" E, F: \- A. n' I& }% h' j8 o
{
+ w0 g+ h1 t. a b2[jj] = vec2[jj];. o1 ?7 B/ u/ k, | Y+ \
}
& n3 z7 P* j p' l
% h$ r J4 D+ v3 u* U& m, c8 F //Method - 1 N=100000 247s ' R; U. w7 Q0 t6 B+ Y) L8 r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' {' {, i$ s9 O/ G u, f ?; a
; @& O/ n0 b' \! g //Method - 2 N=100000 237s) C. @8 j3 ?; ^- ~
/*7 B" m8 ~; |& G0 [8 }" f6 J
for (int jj = 0; jj < N ; jj++)6 C9 {2 c8 |7 G) }1 q4 i$ `
{7 R$ z Y, I2 u, o% z
fresult += vec1[jj] * vec2[jj];
8 B1 E9 A, s) Q. {) F9 @2 C }
6 @( L' u |& ?1 Y8 T' g */ o" J, J( A7 R6 q' {6 e
) j) C* L. ~" a0 X9 f8 A: I
//Method - 3 N=100000 204s
- Y: y) {/ k" V0 z4 V( [& R /*! z# }9 O! u, j! H7 R+ G. O
for (int jj = 0; jj < N; jj++)
3 K- L1 u2 `- _5 }4 \ {
. V" F8 s' B; G# K fresult += b1[jj] * b2[jj];
. Y* @( _2 _( Y7 D }: @9 x9 H) o/ R
*/
5 k' [9 d/ X b$ q
- d. M7 N/ F& E* n- y //Method - 4 202s3 f1 U8 b4 ~6 Z+ c/ v0 c1 j9 y2 `
/*' r3 J4 m5 { q& x# x$ C# a/ J% @
for (int jj = 0; jj < N; jj++)) W) ?1 L+ e( K2 o: ^
{
$ u" u0 E9 a8 w; i" \. z( l& A. q
3 I1 {5 i6 c9 o/ Y/ \+ Z% L6 Y }
; u6 c" z, C) w: h$ B4 m */" D0 z, O8 ]5 S1 A
//comment out all methods, N=100000 202s
9 t, G# s* M% P8 [+ l3 j- c% J }
o7 U' r/ F. U1 @& n/ L( k8 l5 D" \3 S+ W/ H9 Q
delete []b1;
( ?. O9 B u$ u! n" u delete []b2;
& h' w8 x: [% q g4 {' X( l2 } |
|