TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
$ U3 `7 a' M1 _$ e& I' j) j% B2 ^& r7 b
理了理思路,重新做了一个测试。
6 ]9 x/ q1 @! D7 P+ L) r做了两个 vector 和 两个 float *, 都长 1000008 q8 J$ S: x+ S- ?* M: L
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
1 \) R( t2 C8 I5 x+ ~9 o, D1 ^. p$ J) j
内循环试了4种方法,* E% T, O' E; W/ Q- k
1. 直接调用 vector inner_product 247s 2 g1 w7 [4 d' z8 K3 t6 k2 q
2. vector 循环点乘累加 237s
" R8 {2 h; j: L q6 f* [3. float * 循环点乘累加 204s
. f- q: i5 i* {3 d' \$ D4. 空循环 100000 次 202s
# f1 {) `' X& t: ^& r4 z) R% z
( i/ x& V2 i- g5 f1 s9 Y不做内循环 200s
. ^3 P8 L* m7 J d5 D( g8 g7 A/ y+ K: {1 Z
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
/ N9 n% Q, r8 |, c; R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 ^# a7 ] e! U" x+ H4 ^
8 x# G1 Y+ L/ w5 P' m至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ b; C1 o+ Q/ c7 B- w
5 c: H+ r3 o# M, h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* h- a7 s( X t+ g9 y! \
* `' N- s( Q( L3 z! r std::vector < float > vec1(N);3 a8 }# v' r7 O5 u# I/ F% _
std::vector < float > vec2(N);) y: f, R6 W7 n! q3 o/ ]) p
float* b1 = new float[N];
4 b: f9 c: O4 u, m* o6 Y& O1 b float* b2 = new float[N];
$ D/ e7 G% e7 z! M( C8 i' H% J$ r3 g$ A" {5 R6 f9 |$ F
for (int j = 0; j < 6000; j++) k2 U9 N: A$ B4 Y4 A( f: E/ D
{
- P' U. l+ T4 f0 h2 Z std::generate(vec1.begin(), vec1.end(), []() {
5 R6 ?' L6 D9 T. |* V0 J! B9 ~! g return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 G+ A5 J1 u# U# U% ^$ r
});
9 q" `0 ]7 z5 [: f* _. _
1 Z0 I# P9 `) {) }7 Y std::generate(vec2.begin(), vec2.end(), []() {0 i, `1 _: A& j6 j! n7 D' f
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
$ M* c9 g! Q. a0 G });
' D# e n: d+ J* f5 S, P9 `6 R
3 q, k. _( G7 J8 V. O. F$ t for (size_t jj = 0; jj < vec1.size(); jj++)5 j- N1 q! Y9 ^/ I
{& N' _% F. m+ T: c d1 P
b1[jj] = vec1[jj];9 k6 y3 J4 [6 I2 ]) I/ v# i% i& u
}: d; s, I; N& W7 H1 N& y0 ^
/ Q8 _: k: W$ y
for (size_t jj = 0; jj < vec2.size(); jj++)
4 `2 k4 O3 t1 p/ } {# m! W3 |+ \% L* ^! Z
b2[jj] = vec2[jj];
. t5 N1 G- @; Q7 Z0 K$ k }8 F! I% f% d% C: i9 t0 ?
0 t6 l8 H2 I r; `* `2 t$ m% {
//Method - 1 N=100000 247s
' h3 S& d m5 l+ U //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; N8 k, g2 U0 \' P8 u B
0 g# }1 A3 t0 N+ f5 J
//Method - 2 N=100000 237s' h* R3 w8 Z2 w+ S/ y
/*# C# i' r) W) z8 `9 b
for (int jj = 0; jj < N ; jj++)
( } ~, x2 u0 f- F, m; e, a {3 v. |( O: f! F# L' o3 b
fresult += vec1[jj] * vec2[jj];( |6 Q. e- M* x" J' ^3 l
}
1 M* [3 v1 l. a6 W */
: ^3 w0 q5 a2 L& c- E7 p$ J
+ G% d+ c z$ j; v+ r6 ` O //Method - 3 N=100000 204s
% f# _9 W' c# K: Y. |- ~. Z /*
9 Y% s2 q; e. E- @ for (int jj = 0; jj < N; jj++)% E, U F2 ~6 y1 l9 j) i& e
{
0 T5 g |2 O. k0 L fresult += b1[jj] * b2[jj];
( H n; F8 S1 {/ q }/ o1 \. Q& q% r0 `6 f# t8 j
*/
( u, J. B2 J, O( P3 v( ?
5 M7 b& ^/ ^$ K- D //Method - 4 202s3 B8 ~- D6 ], d% D8 {' K# y: y
/*
5 i( f o/ l) b! U for (int jj = 0; jj < N; jj++)8 _2 x5 y g4 `' @
{6 H3 o0 c0 f5 l0 f! l
. b' F! ~, O$ \+ b }( ]: W4 z5 v6 w- }" c( ?" X# P
*/! X$ y# v- E3 J+ X( _
//comment out all methods, N=100000 202s 3 q- o. D B0 } `% N
}+ d; {% W n. V3 L4 c0 w
9 ~0 `, Q, o j$ m
delete []b1;, x: ]+ }/ m' @/ D: C3 S1 i l8 F
delete []b2;
7 U* x4 j) L) U1 H( N4 S- C, p |
|