TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
6 l) @ j0 n* U- a# S- ]. v5 p4 c7 d$ W) p1 I0 y0 n
理了理思路,重新做了一个测试。" }/ Z7 q/ H- f
做了两个 vector 和 两个 float *, 都长 100000! a( H: _1 V$ {
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
# ~+ K5 @$ u1 B* K
4 e9 S6 j$ k" m2 K9 M" o1 s内循环试了4种方法,
- n+ G1 F( N; i5 [4 H! [; T9 G8 H1. 直接调用 vector inner_product 247s # ]# p, _" A3 ? S& l( ~
2. vector 循环点乘累加 237s
$ s, T6 W; {/ X- @: G1 A3. float * 循环点乘累加 204s
$ m7 A" H; t9 [4 L$ P) j: _- \4. 空循环 100000 次 202s9 r- e; a/ `* U2 }- w
5 Q6 t' K2 E4 A9 R! p$ `: M( p! ?不做内循环 200s
# M) s* }4 C/ O4 ?0 v/ ]; `( f& p
你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 i* ~' J' m3 j: b+ ^0 `* d" b
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。+ G: H }0 S6 ^! |7 i1 {% s7 R4 e
6 m- v$ d; X2 j9 H) H& S" o
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
" D( }# s, k1 f7 c' ]2 a1 O( u" a# {" [- z# n" T7 |2 C) F1 T
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* s! y5 y/ }! ?6 g4 }6 j! X' [5 u2 Y+ [: e6 B
std::vector < float > vec1(N);- ~- _" O; u4 G F% `; {
std::vector < float > vec2(N);0 s _9 p1 `- T9 N8 Z5 h. _6 e
float* b1 = new float[N];* C% v2 ]5 }( _0 p! p, D
float* b2 = new float[N];6 } H( }0 e3 _ R7 ^
, N, y# N6 M; d% V; S for (int j = 0; j < 6000; j++)2 w9 m* \' `9 _
{/ |9 }$ g. l' u1 z$ ?: o
std::generate(vec1.begin(), vec1.end(), []() {
* i) |% X8 I. Y4 Z& } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% T( r+ x5 Q5 X7 n( i ~* p });
0 u$ Q( C$ G" T3 `3 P* j' |1 u5 l( V$ G3 F5 g
std::generate(vec2.begin(), vec2.end(), []() {. s1 z4 B8 a5 V. {4 W P8 B: `
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) y( B3 ]6 \' F! n
});( r0 y$ M& S& Z: z7 r& V7 J
0 o2 D' M3 D0 b- E% ^
for (size_t jj = 0; jj < vec1.size(); jj++)
0 g% X7 w( A% \0 i& J! e. a {% q! y1 U* d! _- i: j" v5 }" h+ `
b1[jj] = vec1[jj];) {/ z# C7 u- w' X# e/ Q5 Z
}
; L* E( ~6 ^+ d. Z( b+ T& ?
( f( b$ U2 r, P9 s for (size_t jj = 0; jj < vec2.size(); jj++)9 N U0 o4 f- M
{
3 w; f0 e; b$ a3 e b2[jj] = vec2[jj];1 T' a1 H( f! s: j8 w
}! @" u# O' d+ ^2 _- m" r
+ G1 S* M1 [2 s3 E3 n3 Q* g. S //Method - 1 N=100000 247s
: X% u( E/ D L0 g$ i //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
l! V0 h5 _7 _1 J" M - D# i5 D; g8 j$ y
//Method - 2 N=100000 237s4 b" t( W+ H% r$ b* ~) E
/*
2 k4 q3 O/ f: l' W for (int jj = 0; jj < N ; jj++) _5 H, z- q: R3 P
{
+ G) I- o3 h! Z; H5 r; X fresult += vec1[jj] * vec2[jj];
# [* Q( N$ j# g) G! B k' ]6 B0 j }) d, U' G, X$ X. m1 A
*/$ G' d5 p$ a! i, ~; l
( Q- ^$ s% }( ~( |- s( H. w% w //Method - 3 N=100000 204s* H5 q4 R! C, q% M# m& J6 G* Z4 I
/*
. x% n7 t. J1 E( A4 s2 g for (int jj = 0; jj < N; jj++)
' Z2 T6 f. k! P$ ~6 C {* x* M0 G9 G6 ^9 o& L3 O2 j
fresult += b1[jj] * b2[jj];0 D# s2 i6 w7 ^6 a
}. E% f( ?8 P5 U6 E
*/
3 x+ ?5 G: {5 X; p; f" Q/ w7 L/ N# l% |9 @# V ^3 l9 Y/ |
//Method - 4 202s
, }% Y2 G6 ?. |0 n4 t" ?' o( V: ]5 Z /*
8 I& T2 ]# y6 ]4 m* K+ x; T for (int jj = 0; jj < N; jj++)
) h" ^7 o3 K: [% G, _ {
I- V5 f( o" k
( Z! i6 p$ y# D+ Q$ N7 l3 H }
( ]) G, w; ?6 q' K* q */
2 W, z, _6 l7 v //comment out all methods, N=100000 202s
6 W/ @- q& l5 s7 k( \2 T4 n" o& { }
M3 Z D/ Y- u8 L' R
5 L7 m, R; Q/ u! ?% i, k delete []b1;5 r/ |3 Q: a& L/ F
delete []b2;
) m% @6 d M* s% t) `0 q7 q0 \ |
|