TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 n8 T3 n) E! G2 C& f, k. O4 j& r
k# g' l, s: I) f, X8 y理了理思路,重新做了一个测试。/ K) [* j% r2 d6 L% }, V0 v3 b
做了两个 vector 和 两个 float *, 都长 100000
; G& ]1 Z$ ^9 l. {6 t外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( K& |0 U6 C$ @
2 L! L/ t0 I# r2 i5 B% i( R. X内循环试了4种方法,; c! ]5 q; R2 x; S
1. 直接调用 vector inner_product 247s , ` F% U$ i, L. S+ h4 y" w
2. vector 循环点乘累加 237s
( r3 ~( L4 [9 C2 s9 w3. float * 循环点乘累加 204s6 m4 `$ B5 M3 p5 q5 ]( ~7 H
4. 空循环 100000 次 202s' ^& h$ @( d* k
* a8 W# M: x/ A$ W不做内循环 200s
# ^ b* G7 [( c/ P3 b& K) I9 w2 b
! g/ \. L7 w$ |+ A ~& d# ^你昨天说的对,内循环本身占比是很小的,大头在其他处理。( `5 o2 ^7 x! g) Z! i/ m( j
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" d, t6 S3 M t3 k& F
) A5 @( N/ r0 Z6 k
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% A8 m, h$ r* ` D: h" ~: C, _* @- B$ j5 M! B
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL) ?( e4 L6 [: c
) f! e2 Q0 `5 T3 J2 C) Z std::vector < float > vec1(N);
, `0 y8 _" e) x' D% H' U2 ~$ D std::vector < float > vec2(N);
. O1 w# F) h2 X- y, y float* b1 = new float[N];0 s# H* {$ B8 E7 ?7 `1 q
float* b2 = new float[N];
- n1 V3 q/ p$ G, ~9 V5 {. C0 y7 I5 f% a' a4 i! r3 d
for (int j = 0; j < 6000; j++)# a* u/ a: J% k) p& q, \
{( k* e J7 t- u
std::generate(vec1.begin(), vec1.end(), []() {
* Z; W$ O' p. m/ x5 e; M( r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' Q3 q7 }- K0 @( i4 g6 ^ });7 L, z9 r3 Y1 j8 t$ m" W
0 G6 a5 t1 ^& D8 T! R. N9 y- q std::generate(vec2.begin(), vec2.end(), []() {
, d2 {: E+ ^( w0 n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
- ? @: C9 l4 g* I* \+ e });- s; [3 R% P% O1 z, F3 X* _
- P! U4 t) v) B+ y
for (size_t jj = 0; jj < vec1.size(); jj++)8 W3 x+ e l, z) c) u- R8 d
{/ \' r# H) S: O$ g
b1[jj] = vec1[jj];
% L5 v3 Z5 U( N0 H }' }4 q$ ]- |8 p9 x& F" M! `
- B9 M5 C( F: B8 @- v+ U for (size_t jj = 0; jj < vec2.size(); jj++)1 z% W5 H% G: @2 ^* b( w
{
2 K7 N' b" ~7 ~/ ] b2[jj] = vec2[jj];$ B5 P& D% m2 o
}
8 V4 N2 @/ e6 m$ A: w8 w. v c; r0 `% y4 i! ?8 r9 {; A: n& `6 K
//Method - 1 N=100000 247s
, d) }' o0 i& b+ t- u( O //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);% C3 K; u$ y: ]4 z0 C
5 p! w- ^1 a2 T1 J9 j
//Method - 2 N=100000 237s
: m2 M6 [4 t1 X /*# I" l0 Z9 e$ S# ?% a3 |
for (int jj = 0; jj < N ; jj++)3 l7 s0 ]- p; v2 h$ Z% m) E
{
) ]; z5 D" w' B7 \ fresult += vec1[jj] * vec2[jj];0 p5 D7 a* q8 h7 v% z& f; w" U
}( i# F" _. x( n6 s
*/$ ?' G4 y* U5 x% t. l; g
0 j1 {, Z: M1 f
//Method - 3 N=100000 204s$ g2 Y1 i) Y% P5 O: K0 e7 x* g
/*; j" s% h7 S8 m& a
for (int jj = 0; jj < N; jj++)8 f1 b+ i2 D$ F8 f! e
{
7 s7 ~* h6 C6 i" { fresult += b1[jj] * b2[jj];- F7 {% r+ t- C2 D5 }, C$ a/ ], Z
}5 U: M1 T8 C8 x" u" s
*/
8 M" j5 {; }4 C" g" L
( A: t( ?9 E, t8 T# R( y //Method - 4 202s
W; c# J, q. |# i6 \ /*; d# f% v4 X6 H1 P: L% N, l
for (int jj = 0; jj < N; jj++), C2 c, v+ s. D0 E
{( E! q9 p) E3 u
7 } X$ _, Y6 L6 L
}0 r$ z' n1 X7 ?7 \( v
*/2 N& Q9 c$ W7 _% ]! U1 t6 H( A9 b
//comment out all methods, N=100000 202s ! Z( s+ V+ T* g' g
}- L8 E5 C1 {( u$ p8 L6 ~
4 f$ R7 q4 A8 s
delete []b1;
# L, `4 @. E* [" k$ w9 L delete []b2; ' H1 S( n6 C% r9 I- b4 w& I* p
|
|