TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - j7 \! D# c5 Y9 Y
) x' \8 v9 Y$ Q' j, e理了理思路,重新做了一个测试。; p! L- D8 H$ H+ a' D x
做了两个 vector 和 两个 float *, 都长 100000
3 z& U3 ?2 K0 g* D& S$ V+ G& |外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 Q0 k+ e+ \# N
( {# [" O+ i" Z内循环试了4种方法,, M' N3 F. j# f0 Z5 C
1. 直接调用 vector inner_product 247s
- n' M+ G* e. ~4 h$ w2. vector 循环点乘累加 237s4 ]5 A- \2 [# z8 P
3. float * 循环点乘累加 204s
% \2 r6 Z2 ~; R+ r L4. 空循环 100000 次 202s
+ e9 i8 v7 w* X- ]0 m$ z" Z9 B0 o) R$ j: V1 T
不做内循环 200s
4 S/ y/ N- j0 Y: s, i6 p4 g# I
& y6 |: y! Z* @- z* {5 d* H9 B9 J你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- \+ G- z& g' C$ U2 ^1 C# r另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 t* O8 n% v P; d: F
% ~& G, r- O, N- {! a2 J p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
) I5 H- n2 o- q& L
) W8 s) t9 k- X# m$ Y1 Z& p/ e- t/ M(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)3 m. z% j# |; x* J: T$ |
+ G) Z' N, J0 k: Y' l9 f# T std::vector < float > vec1(N);
. [4 y7 ?& f0 R% h5 O' N8 K0 n. H$ p std::vector < float > vec2(N);
' g; K: p5 A+ S+ c( }# m }5 S* M float* b1 = new float[N];8 i( P5 f- Z: z- c. r5 h" U
float* b2 = new float[N];: Z0 C! ^5 R3 C6 n
+ u5 ]; P* Y/ t0 X1 E
for (int j = 0; j < 6000; j++)
# _7 Q& g1 V' e( [+ A/ y {$ U( b/ u) n! A( q M
std::generate(vec1.begin(), vec1.end(), []() {
$ _& U. z' a, P( d' c Y( N5 } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, ]2 m- c7 G" w
});, n- K0 L% v) `
4 k0 z6 x# p' x) o, Z
std::generate(vec2.begin(), vec2.end(), []() {; T' x6 w& V3 }' U% }+ m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, t! a6 g- C7 e1 o% _. w7 m0 b });+ D" }. o& I2 t4 K& ]& M# W2 A9 a n7 K
3 M# ~/ p* P2 G for (size_t jj = 0; jj < vec1.size(); jj++)
+ ^3 z+ |3 w$ Y8 x7 P' ~3 C {' } m0 p/ {7 d; r" n
b1[jj] = vec1[jj];# _# n1 }$ B" o
}9 {( [ U- F3 c6 n7 ~9 Z
9 V3 n) ~5 x8 R; W3 i for (size_t jj = 0; jj < vec2.size(); jj++)5 [9 G: K2 c# \0 o
{" |- l2 |% E6 W9 T5 V
b2[jj] = vec2[jj];
$ Y7 E8 H$ k# c& C3 o3 x }
+ f# X6 O' q& a* }( ~
* E) I, R5 @' @; h //Method - 1 N=100000 247s 1 M* ~! P9 I( c& M# b( Y% b% |
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# L4 x% f; @0 i. Y1 O5 a
9 n7 v3 o/ [" ] //Method - 2 N=100000 237s' v# |8 G$ H6 K. p! N6 Q. D
/*
: u" M8 E- u6 }, J0 B% r+ t/ L1 D for (int jj = 0; jj < N ; jj++)
% r3 b. B: D+ n4 `/ G {
4 z% I+ N$ r& S' G: Y( Z fresult += vec1[jj] * vec2[jj];; H, j, B% _, m+ g. j d
}, Q, {# h+ c" b% X- {5 w
*// L- k+ c* S1 O. _
7 Q- q% y) N/ Z //Method - 3 N=100000 204s
+ `- U9 r; |8 x b) `: p /*) I' {' _" u( \, x
for (int jj = 0; jj < N; jj++)
) d7 ^8 ?, q% n3 [: f% g [6 d! N* S {
+ u" c" v/ ?# |2 W fresult += b1[jj] * b2[jj];
, C3 x3 r' Z% R5 } }
7 e4 J5 k8 ^9 ?( U; e */
7 } v& t* @4 {
, y5 w+ q+ K" C, a* ^: \- R //Method - 4 202s I6 A& B# P2 |5 X# y; H2 z
/*
' E& k }* N9 g6 b3 B% K for (int jj = 0; jj < N; jj++)/ R' K s2 w1 D; q6 Z& e1 I
{. i" }- ~, `* x* b
9 S3 c- f; Z3 W/ `& x1 X }7 R) U4 T% U6 y K& b7 v
*/0 k& z: j- H" H2 H+ S; d$ X
//comment out all methods, N=100000 202s & ~/ D7 }6 b" M
}9 M; s: B h- f
7 W7 m4 Z! x7 B( J7 C delete []b1;( z4 d! I. C+ J( V' C* Z
delete []b2;
" q& R4 | |5 S7 d, W |
|