TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, r- s1 m3 H$ o& U
* W. w" K1 d3 j# X7 b) e. c5 l+ R7 x& y理了理思路,重新做了一个测试。, p9 b1 u- R# y# v4 O' D+ D
做了两个 vector 和 两个 float *, 都长 100000
! b6 t. |: N0 b9 J3 \外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., u- g% I7 V( ]' m7 c$ n+ b, Q' h R# P
) K' P& R* Y9 r& |7 H内循环试了4种方法,
% g' v- j# e# n! o1. 直接调用 vector inner_product 247s ( E6 Y' z$ @) o: w$ M
2. vector 循环点乘累加 237s
# T% F( `4 x. w" c& y3. float * 循环点乘累加 204s
* [' ?( _0 h8 z9 N" O5 W' V4. 空循环 100000 次 202s) x; L8 `2 C+ j) u2 Q9 j. [) y/ @8 I
2 h( q7 O8 P' a8 }* C
不做内循环 200s: M7 D+ J2 m2 D) |
7 f, |0 T! K- E; N# ]$ L* K你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 e% J1 l* l3 \( K$ w
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 U$ o# b) e; ^2 Y7 _ H+ ]$ u" D
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" v' P9 ~4 ?2 Z
( X" ]$ t t; I+ i& a
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
9 E' j7 h7 \" V2 f/ B$ ]7 e
: V( x, C& s6 E std::vector < float > vec1(N);
J& A# |( `1 V std::vector < float > vec2(N);
8 P6 g- w( H V$ i float* b1 = new float[N];6 Q7 ~% N$ J2 R) Y4 F2 W
float* b2 = new float[N];
( a7 D+ g( z* N* e2 i/ I+ A' @' p- C) v# Q3 g( p& z- }
for (int j = 0; j < 6000; j++)/ Y9 K: h5 n! v- G" S8 Y- O. R: v
{
8 M5 q& d+ i( f9 B- j( ^ std::generate(vec1.begin(), vec1.end(), []() {" |' n; i1 W8 L* s9 X, e% k
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 m6 X$ v5 C9 Y" t/ j) F' M
});! n! D* a) p! A
; l+ s. W. P. w$ c3 v+ m
std::generate(vec2.begin(), vec2.end(), []() {
0 a6 S& V2 p# m: l return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
1 Z( K3 f! p# Y: e });
7 y. e: L$ g+ M& p7 d* u: O3 o' R# r$ A. q+ |$ w& C( A
for (size_t jj = 0; jj < vec1.size(); jj++), [0 i5 L% q+ g" A) G- U0 n
{
& Y4 }5 f4 ~3 C( Y b1[jj] = vec1[jj];
: {! S' I; k6 U$ o B' { }, ~% H3 k- c- V/ a1 \/ R; q
$ r9 o7 t5 d k for (size_t jj = 0; jj < vec2.size(); jj++)
1 H/ O# i6 G; m+ l) l {
) L( K" F$ p0 m! x4 B5 U" U. K+ ? b2[jj] = vec2[jj];% x3 h4 R0 E7 l0 U
}
) t+ T: C( B5 O8 @" D. B. U
0 g% m3 a$ a' R) ?- i* i9 C //Method - 1 N=100000 247s g) I7 f$ Z9 ~! |5 }
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0); D3 e9 e( |. e6 }( U
, {, O* A5 A5 S$ E2 Y: } h5 d8 @ //Method - 2 N=100000 237s
7 q$ L7 q# g2 U$ a/ i% _6 S /*0 g! ?/ J5 l" |/ j2 F* B
for (int jj = 0; jj < N ; jj++)
0 n' M7 a3 r2 N+ U& d+ X1 U {
) `' @0 i. [! M2 n J" m fresult += vec1[jj] * vec2[jj];7 i1 M: W7 s: G9 t# ^4 P) ]
}
" c4 G: T# D) c; [ */9 p' \9 H+ C8 y$ ]
- S/ c8 S( }5 |0 _% @ //Method - 3 N=100000 204s* _, X5 `- D! x9 T
/*
' k7 W" |% V; ^/ ]' T for (int jj = 0; jj < N; jj++)0 V& j6 R8 F6 p" X
{% K/ U% `! c- E4 C
fresult += b1[jj] * b2[jj];4 F- ~6 V% `) ~; W; K' B$ @
}( V! I: r! O3 }3 a( g4 V
*/- O {1 z$ V1 Y' ~( A0 W
K$ I" [6 _4 p0 p0 n: `9 P% e
//Method - 4 202s
4 S# \% P* _4 G$ @$ C# `* z /*
' M$ F( }8 ~6 r; t% d! Z for (int jj = 0; jj < N; jj++), i# T r1 I0 r0 s
{& ?! a& m9 Q2 R4 y5 s9 b3 ~! f$ @
! }$ i2 Z* O) p+ Y }
# b( ~/ {, w3 M" u/ [ */* R# {; P1 Z6 C: X' J3 {
//comment out all methods, N=100000 202s : N! A: S) W3 v, E- L
}
& i! \& }4 @, F' g8 ~6 x
* B; W, S) Y$ A$ f1 Q delete []b1;
/ i( f# J8 P- ~0 G1 t. n) | delete []b2; : @$ G: L' B) T: R) \' W: w# U1 ^! [
|
|