TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
: j- _* \: ?; E
" b7 F5 q: _) ?7 D! p理了理思路,重新做了一个测试。
7 t0 O# }7 `; U5 u; w) n6 ^做了两个 vector 和 两个 float *, 都长 100000
( h' r. k0 n# ^ B" ?! A外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
, i4 ^% B+ ~1 C7 m4 J/ W3 j1 S8 ~) H, \0 t+ Z
内循环试了4种方法,8 ~/ s8 ~. n( Y% i- X, k: m
1. 直接调用 vector inner_product 247s
6 U& s8 ?& y5 l5 Y1 Z2. vector 循环点乘累加 237s
. R, E6 ~1 T1 O7 Y9 m3 s3. float * 循环点乘累加 204s
+ u# y$ P4 S% z! ]9 L' J4 K4. 空循环 100000 次 202s( g. T+ n: `% W7 r5 v' Q
' J" G, O6 A# l2 Z) | s不做内循环 200s
* p4 f6 n5 V# i4 `; n* {/ l. a' U1 w4 m' l1 {" u
你昨天说的对,内循环本身占比是很小的,大头在其他处理。! p7 i6 M# c6 T: q( D
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( n$ d7 X4 I$ ~' ]. M0 V8 t
( H9 e; s3 p r; B/ e至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
6 r! \% o0 c1 Q$ l. W
/ \" s% a/ B# m/ H(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)5 }: _7 T# b' h7 c9 u+ F) _5 S
0 _! R0 S: Z* l) @/ g6 S' O std::vector < float > vec1(N);
2 r$ V4 s( w# K, ?1 T std::vector < float > vec2(N);
6 w! q1 f/ j! N! I( j! J float* b1 = new float[N];0 M K' R) ]4 b }& t% d- p
float* b2 = new float[N];! l8 ~. ~1 R& }6 j! U( G
C/ r# F+ X+ W# Q, B for (int j = 0; j < 6000; j++)
: d# o% V; c- L! G& { {4 ]7 z* b" f8 M; g
std::generate(vec1.begin(), vec1.end(), []() {
4 P, Y9 C; |! J! B5 H return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 @) @: H9 ?* d# r
});
% p6 Q# c" j! M" c" c4 ~
' Z0 s+ @- V% n std::generate(vec2.begin(), vec2.end(), []() {, `$ O& x$ J6 _9 n! [& `# O
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: T8 `! P* s; C# R' k- p
});
6 L+ L2 ?1 t. M- Y. k" S) ]$ x2 ]; q( U0 k5 i# x
for (size_t jj = 0; jj < vec1.size(); jj++)
/ C9 ~' [1 V. |+ N; G* ?. x" g: v {% D R' ?5 o* q" J. X( F
b1[jj] = vec1[jj];2 U" F# [) f9 I6 L Y, O. |
}$ C3 s* I! h; v$ V# [
% ?& o1 W$ C; ~ q4 c! |
for (size_t jj = 0; jj < vec2.size(); jj++)0 W7 c& x# }- e& y8 d$ l
{
% ]4 K7 ~0 k& s b2[jj] = vec2[jj];
1 z9 K1 g9 s' I! g# q5 m }
c2 d' _" v- n$ n
3 Z q; ^" ~ c7 E; ~% h0 u //Method - 1 N=100000 247s
W# N% j. N9 a //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ `, ?8 X5 D z7 {
1 L& Y; d% F1 `$ R' D //Method - 2 N=100000 237s9 C, h% I7 x/ ~* q
/*; I( Y# \* g a
for (int jj = 0; jj < N ; jj++)( g* a' U) Q# O( g
{
! ]8 l6 G8 C2 {' N fresult += vec1[jj] * vec2[jj];
/ O& r2 I& E7 e8 |# T }- H% u, g9 J6 B3 O9 D% L1 [* M3 Y
*/( h* b! x2 B( @4 s; i
6 f! l; C O) D+ i# P$ ^2 a //Method - 3 N=100000 204s5 \6 w# T# M6 r+ W
/*
9 V; \. j# f3 c5 \8 X% l4 W3 D for (int jj = 0; jj < N; jj++)) r/ P& ^+ O+ S0 h7 c
{
* x; u& ^( i8 ?& Q: F+ ]6 z7 h4 s fresult += b1[jj] * b2[jj];
3 V( W) H6 w0 L/ G. g, J) h6 y8 ^$ p }- F1 I2 ^- d" R8 Z' b
*/
8 a7 I/ L6 S7 j
3 a! b7 S. |/ V7 w" z* a& @2 Z/ S u //Method - 4 202s
_ O0 w( w7 K0 H {. |6 k/ | /*2 B/ u, J4 D' x8 H$ |. [& g
for (int jj = 0; jj < N; jj++)) H0 r4 u$ w2 Z) {$ z
{
/ [! k& V' \, ^1 y/ p U
" W% |; e2 t# V }
) X% H5 f" V4 S */& e' l* |9 }* P' B, T
//comment out all methods, N=100000 202s
: E% ]. {/ t1 m6 E# E' P }
: a, O7 \, \0 L) Y2 P+ y! z5 z" O/ @2 P7 Z
delete []b1;0 O2 X5 `* a$ R
delete []b2; 8 \5 x( f l- j
|
|