TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 H- C) w. u1 w: t- U7 ^! I: k. r5 {9 q1 p @: \2 O
理了理思路,重新做了一个测试。1 P6 @" @8 y9 b
做了两个 vector 和 两个 float *, 都长 100000: j- Q2 n; W( M2 [! y: D0 ~
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., t, C" }6 k @* Z+ [
) J c/ U. b% M
内循环试了4种方法,6 d. |7 G# l- x+ C9 j* @/ ~! w
1. 直接调用 vector inner_product 247s " K0 j3 h5 @5 Y
2. vector 循环点乘累加 237s
/ ]& x# x! Y2 N/ R) t3. float * 循环点乘累加 204s
6 C( g3 i7 ]7 i3 l3 e2 [4. 空循环 100000 次 202s
3 Q9 G9 R" ^/ T2 a; U6 X/ v- `' c% e+ M9 b3 B
不做内循环 200s
, ~* l: Q" C$ [5 z9 i" Q
/ V% k8 |1 p+ V你昨天说的对,内循环本身占比是很小的,大头在其他处理。" r/ Q: Y# ~# B( ^2 e
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 T$ U0 }: i( G) Y( B$ x% y& _; v$ ^8 N7 v; @& b! x
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 R. J7 e- Q: }5 P6 S/ ^7 R) z
5 M4 _" A {; I" z+ A(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 ^% Q7 @. V8 W! ]' {
9 f- [8 B" I& F: u" d' q- D std::vector < float > vec1(N);" F, c/ H |! M7 u
std::vector < float > vec2(N);- H) `6 d5 Q! L5 h, e$ d
float* b1 = new float[N];: ~4 i+ T& o! b8 V& c+ S
float* b2 = new float[N];3 ^5 s: _/ C# n3 v6 j' |9 H
/ w+ j1 \2 O) P% i8 q for (int j = 0; j < 6000; j++)9 x" E S- j I. P
{
8 R$ h. B3 N1 S2 C$ n std::generate(vec1.begin(), vec1.end(), []() {! o' g# |: ^# W @9 H9 D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
6 q. l4 P Y: R });, E; G9 ]' u( [4 M. U: v4 L5 V4 N* L9 E
; F" X; J: q2 B1 J. m) y/ I
std::generate(vec2.begin(), vec2.end(), []() {
! Z: I4 X$ [ N6 R/ U return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' q+ @8 f4 X$ m# C# Y4 m; N
});
7 u# J8 o4 A, ]2 L2 @6 }1 a+ E4 ~8 I* a
for (size_t jj = 0; jj < vec1.size(); jj++)* N4 g e. `0 B0 D1 D1 H8 |
{
" f# ?8 C) ~: W& [- @3 u% a4 E+ ` b1[jj] = vec1[jj];/ O0 o! s8 l9 d2 p# C! @" [ G
}2 Z# k0 D) ?- v3 N* @
! i( \ @, Y$ p" U
for (size_t jj = 0; jj < vec2.size(); jj++)
% Y- u7 Q" N# `/ j {
! S, z% y8 ^( _- h2 L Y Q8 l. Q b2[jj] = vec2[jj];. e6 _4 M0 A" x( z0 D6 M* S
}& \& `! \+ j$ {# P3 [
4 y- }: w" ]1 Y! B+ C* |. ] //Method - 1 N=100000 247s
5 `8 U/ ?& q3 H. {3 P8 h //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 Y3 E+ x* g# z( g: s9 L! v$ ?7 _
$ Z* i8 q: C/ r% G //Method - 2 N=100000 237s8 p( s8 d7 ^8 L; e7 a
/*
6 W. b7 h; {9 _6 i4 C# G2 E' H for (int jj = 0; jj < N ; jj++)* `) [9 Q `3 [4 I; R
{) I. b) }# G- X# [0 h, e) u
fresult += vec1[jj] * vec2[jj];
. j6 X+ W7 N& |. A, B; ` }
, _$ N: Z6 A; {& E% t% y& b */7 \; c' N- d( |' ~1 H4 K! ^5 A
( r' ]+ Y8 ?4 T; b0 {% V" ] //Method - 3 N=100000 204s' F4 e3 i! K+ J2 R$ @2 w
/*7 I2 b( [2 _ ?/ M
for (int jj = 0; jj < N; jj++)+ H( E \3 j. k$ ?: v6 A
{3 E0 s! @9 q. s+ e a. }
fresult += b1[jj] * b2[jj];$ c! @( I4 S9 V: e; R+ U% Q
}
( t9 R p v5 O3 ]1 f7 f0 C6 L6 q */
# v6 I7 z0 a% z' Z$ t1 ]% T
" ^% l& V% `; U8 f //Method - 4 202s
: ]$ j+ ]$ k; o- N: h7 [ /*
3 |8 U3 |0 t5 L+ ]5 K$ z for (int jj = 0; jj < N; jj++) N3 U4 @ u6 F
{
3 o) ]# p6 v5 G; g ^ + `. S6 B$ S: Q
}
7 X4 o8 ~8 ^) w- t */
$ o" t5 | x) M. [( T8 k //comment out all methods, N=100000 202s 5 i w* \( H; X9 q
}; w8 ~* Q j( f2 e% D0 I0 E% Q
; i; i, E" c/ M4 w' [/ q
delete []b1;1 ~8 Z+ M$ s- t2 \2 f
delete []b2;
8 \# q" i1 z5 I+ D |
|