TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 X1 U1 L( Y4 Q; }0 g( C
& a/ m) p A/ k- l理了理思路,重新做了一个测试。
, l/ F8 s, c# y6 v: Q做了两个 vector 和 两个 float *, 都长 100000; S- d: v2 @, @4 v9 F6 x- q! z H
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- o4 f5 a' h5 j0 {% n; i
2 A9 ?% {7 t; P内循环试了4种方法,6 V1 k+ Q! F+ `5 `9 y& q5 _! P
1. 直接调用 vector inner_product 247s 0 v* D4 J3 ^6 ~& ?9 I1 V* F2 k+ a7 f
2. vector 循环点乘累加 237s5 O& P+ I+ b+ M) ~* N
3. float * 循环点乘累加 204s) S7 A/ p; ?# u9 M
4. 空循环 100000 次 202s* x, i5 A; _& m& i# `5 p
. i1 \$ R; z' v& Q, g" Z, ]不做内循环 200s
" q. s$ K, D# b8 d; ~6 l; a9 _8 B* V4 t) s# ^/ b+ A. R6 i
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
7 y' D5 o: G% M9 n6 M, K* \另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
7 Z- D0 U# _+ l e! N, ]4 O" E; h3 m' S! g2 J
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 e) t, j7 y/ E3 Y5 o* g
+ g% {) E& o5 B
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 L+ q* B. a8 K3 \9 l
' S d# H' E4 r std::vector < float > vec1(N);
% `' C8 p6 \/ c0 @ K std::vector < float > vec2(N);$ t- s" N9 M% W$ G8 h
float* b1 = new float[N];
# S7 {# d- N5 D ?' }. g float* b2 = new float[N];
/ t! p& {0 _; y6 L @. l9 y- K. ~
9 H8 ~$ K7 o3 M- c for (int j = 0; j < 6000; j++)
$ Y' n% B/ L& m- z) ]" j {
9 F! m# O5 g& K3 H- D std::generate(vec1.begin(), vec1.end(), []() {$ N, `+ r- ]8 k/ M% V4 `5 E
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ v; r, z- h t2 L$ y
}); q+ Q' j' u6 j) S% x
' e! T) C8 c4 ?, L4 i2 C2 n+ j std::generate(vec2.begin(), vec2.end(), []() {
' }7 Q; u, `: m e5 d return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
o9 c$ T! {6 i, y. v' E: s });5 i) t0 @9 U; l# t
& F0 x( }6 f1 f- g: e3 C for (size_t jj = 0; jj < vec1.size(); jj++)
, d, f z8 C7 _4 }, b {( l7 B4 _7 L' V' U6 \- j
b1[jj] = vec1[jj];
1 y% f! h/ ~3 `( F }
3 |' j& O3 L) i( z/ S7 j/ m P, r
for (size_t jj = 0; jj < vec2.size(); jj++)
# `% M8 h' [4 `2 F" ^ {2 u8 S0 K0 @, w1 B0 n4 X; ?
b2[jj] = vec2[jj];
5 W: W/ R4 d3 Q3 N P2 d }
( e9 B, b, Q, V2 ]" U
. j- v/ a# T. V0 Y8 f5 { t //Method - 1 N=100000 247s
- f$ Z: |' V. P5 a0 B9 p- e( T //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
; q7 r* ?+ R A$ A, V / q9 [) i7 ?4 I+ D) Z
//Method - 2 N=100000 237s
: v9 ]2 E) s1 M /*
' N9 F/ O5 r( B+ E2 C x) C for (int jj = 0; jj < N ; jj++)% L8 [% \9 p% h) H4 s
{
# W. L3 {" p" k- I8 r) ^ fresult += vec1[jj] * vec2[jj];2 }' e4 W. b# Z9 @( p1 C- I# t
}8 V5 d7 B1 E1 X2 A
*/
6 x/ N: u7 i" Z 5 D. O: E1 f1 p
//Method - 3 N=100000 204s
. z: W+ O. y; {! u$ ?: i/ n* v /*9 B# o% C8 n2 z: K
for (int jj = 0; jj < N; jj++)
# \, U$ V4 V6 f+ ` T' z- a& d {
3 M0 i3 }$ F6 ?, w6 D fresult += b1[jj] * b2[jj];$ V; O# r3 J+ p9 L" c
}
$ ]2 k8 ` q5 ?- Y! d */
$ N/ y# h8 B1 n9 u8 d" v' _% L" c" H( }
//Method - 4 202s
' i/ } p9 M% e w /*
# Y D4 ~9 C* n# A9 f& C for (int jj = 0; jj < N; jj++)
' R# C0 N# A- C A5 V {
' w) ^2 T8 y1 T; D, u. }- ? 7 A" G7 R( y$ H: P0 g4 W3 g0 C
}
- g4 T! h, A( S7 ` */7 z+ U9 e" d$ R$ M0 J6 a2 o6 M
//comment out all methods, N=100000 202s 2 e, {# S2 D4 g9 s6 n
}
9 C$ A4 Z ` _3 n2 I1 \# b, |3 L6 m% b/ ?- R5 R
delete []b1;- l5 B1 r2 m( F& G. _& r" ]8 T
delete []b2; " A& [4 O+ ]. T" J+ R$ f- {% c
|
|