TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 # b4 }" Y& M+ W8 Y" d% o: w
l9 h7 W( D! T理了理思路,重新做了一个测试。$ B5 h: y3 n0 L d# d
做了两个 vector 和 两个 float *, 都长 100000
" O9 B7 R. X$ v1 `6 b外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' b' E: e- P* R2 z# y( ~
# A/ Y; Y& y _/ }: `: T0 C; [
内循环试了4种方法,3 I- G4 h$ y* B
1. 直接调用 vector inner_product 247s
# e- w# J3 m) R' E2 r: V2. vector 循环点乘累加 237s
6 Z9 h+ j8 h) D% Z3. float * 循环点乘累加 204s% y# g- A, K4 N9 F" x! D
4. 空循环 100000 次 202s" P/ H ?8 C/ z: a- b* b
1 g# F8 V+ }9 s0 C
不做内循环 200s
' E/ v1 k. p) K9 p4 w5 h2 h: O
' q+ [2 O. r+ x你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 e: F" u0 M! D$ z, u0 k
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; [' U+ T6 G, f0 c0 H
6 W' e$ S1 ]( {4 ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
/ A" s g; I# Z- R
( M- ^! T5 t. K; }3 [7 U/ s6 U, l(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- c: @4 A: ~. L3 p6 {
7 S8 q; e$ ^( L5 ] std::vector < float > vec1(N);3 a/ m8 A2 o0 v7 k. u
std::vector < float > vec2(N); d7 p2 t' I7 W; Q' |" v/ ~
float* b1 = new float[N]; a# O5 R' b% H M0 @
float* b2 = new float[N];8 ~) L& y" P+ Z% K7 [/ B Q! l& k
% ]8 |8 B2 E- H for (int j = 0; j < 6000; j++)
4 B; d: w) V' Q7 H3 ^4 E9 f {. J: N: i, ~( k0 B* o) b2 k; L' q
std::generate(vec1.begin(), vec1.end(), []() {
1 i. `+ I% N" m/ k$ M2 ?& ~/ L return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ Z! \; _1 K8 j: o0 o: n3 P
});) p; R% ]/ y" C( P( u
/ B. ^) U: f* p( Y) G1 j" z) z
std::generate(vec2.begin(), vec2.end(), []() {
$ Q- I, N6 b, l' L return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
: u9 V4 @% [' d4 r9 }* V4 z });( v5 x" c# X8 x/ e: A
0 i: {7 f! ^. W8 I% s8 N for (size_t jj = 0; jj < vec1.size(); jj++)
) L- c0 x7 D$ ]2 n3 a' d# a7 ~ {
" B9 d# C, R$ H: ` b1[jj] = vec1[jj];
H0 M2 `; f) q9 X; S# a) z$ M }- m, ^$ o- \8 T
2 J: N8 G, F3 L9 ~ for (size_t jj = 0; jj < vec2.size(); jj++)8 P2 h0 [% `: S1 B H5 P
{
3 I' ~ Z' s$ H/ d' b9 y b2[jj] = vec2[jj];* P$ U' u1 ]% `# F: Y6 Z
} ^+ _8 i$ J9 a8 T
/ i( w5 e. o/ F m6 I) x) s6 C //Method - 1 N=100000 247s
' f9 }1 d* J. u# W9 r( h //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 V# l W/ F% U8 z g0 G" D
+ W3 Q* B- W# Q5 H/ I6 e //Method - 2 N=100000 237s
' }* S) V/ _4 b& `+ @7 I1 K) d /*- y8 c$ s% M# {2 H
for (int jj = 0; jj < N ; jj++), `0 M9 f: M L. l: g
{
: b; _. i2 c) {4 A fresult += vec1[jj] * vec2[jj];
2 ^9 a% a: U$ L& M. x0 P }. t7 O( R7 {% G& m; h2 `; k
*/
" y! e! B: v' }/ w+ Q. f & Q1 H* k7 L- \3 Q9 N4 e
//Method - 3 N=100000 204s
8 [' Q, D" J. B6 } /*
+ Q5 P8 e. l4 ?9 c( O for (int jj = 0; jj < N; jj++), X% V% q6 w! W& [' M1 p
{2 ]& C9 K! C% j: {
fresult += b1[jj] * b2[jj];
- R6 j# a1 n4 X3 V- y( c% P }, L* K7 E, n( U3 {7 K& {
*/
" a9 U5 c; @9 L4 a' U! r; Y) x9 g, H% ^; t- K
//Method - 4 202s
2 X+ C4 a' S! d' b/ F /*
5 [/ ^( |4 D$ f for (int jj = 0; jj < N; jj++)
% ?7 d# A* [2 c* l: X' F0 z {) \9 D) f" ?" b# O; {& [! O4 b
0 Y4 @; Q& x2 y3 k% C
}
2 w" L/ K0 g* f$ h. @2 d0 Q */
, H0 r5 G% o \( [' F //comment out all methods, N=100000 202s
9 R0 g C) @, j: `; D9 h$ X }
" U9 k7 ^2 ]2 g' ^- b( M
9 m3 ^3 [" c6 B% T2 Y7 R* |3 O delete []b1;
7 V9 j" n# I) J4 U; a9 m' G* |6 e delete []b2; ! }3 @7 }* [4 q& v( w
|
|