TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 K$ F+ J/ Q; W
: t, t+ P. S: B理了理思路,重新做了一个测试。
6 x- q$ B2 o r+ Y做了两个 vector 和 两个 float *, 都长 100000
& J5 \) v; h' o( M) g! p2 E外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
, K) V/ s' h3 q
$ e$ T* @0 H$ o ~0 R内循环试了4种方法,9 M# E+ e& f" f& L" |$ P
1. 直接调用 vector inner_product 247s
. C0 `4 [1 L$ m1 J: H9 ?2. vector 循环点乘累加 237s% m' g: S0 Z% d9 b
3. float * 循环点乘累加 204s- @2 ?- O) X5 J0 @% ~ c
4. 空循环 100000 次 202s e; B7 A [) G
* [% N z: K6 ]3 e不做内循环 200s2 {3 Q6 l; K! P
3 U" M4 {) J& o1 D; A/ t5 A你昨天说的对,内循环本身占比是很小的,大头在其他处理。0 k' y. }7 c( j, I7 M3 h7 K4 k) M
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
# x$ o" L& b. |) w! A0 W: K
" ~2 S2 P6 j; v至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 K; h5 U( Z5 F. s6 P1 e2 L
" w* _" c! V4 S) b(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
9 m( n) u' Z4 g/ W/ [ A
+ z! x% e/ @3 j' ]) H# s3 ~ std::vector < float > vec1(N);
' u% V: P& H3 f6 `+ s1 x: P std::vector < float > vec2(N);. R0 K: j' U2 ]' n0 \: T) F
float* b1 = new float[N];
' \9 N, r, l& k( z, N float* b2 = new float[N];8 ^% C$ l) a: {( f% Z+ u" d
3 E- I8 J% q. o+ S4 c$ |6 D8 r for (int j = 0; j < 6000; j++)! W6 J( l4 f: K6 D" d
{& O) L+ d: L* G# w
std::generate(vec1.begin(), vec1.end(), []() {
# m6 d3 w+ I8 j return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- T4 |/ @/ i- |$ W+ i/ ]( f/ v! l3 y* A });
4 u/ g$ ?1 v, d/ z3 v4 E
% E% u- K% Y$ m1 A" x" l4 F std::generate(vec2.begin(), vec2.end(), []() {/ {- I0 U/ q8 X- u( ^: f) d8 f
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; j5 \% p# Y- L2 r' e: h });2 @' I/ W$ a; Z/ w4 @
5 T! ?( |) p! l9 Z J2 i for (size_t jj = 0; jj < vec1.size(); jj++)
2 h+ N, R4 s% `& G8 u {5 Y9 Q ~: [6 Z
b1[jj] = vec1[jj];4 U8 M- u' v. V8 |
}) Z5 ^' k% v& E+ l2 r
7 R8 H0 _; D" S: r5 H2 g U4 H
for (size_t jj = 0; jj < vec2.size(); jj++)3 ]7 l: \# v3 y; T3 Y
{
( ]/ J6 j+ |+ Y# W3 l- M b2[jj] = vec2[jj];
9 K3 Q! h" F) y) a } Q2 a& j' z+ B
- S2 j% |1 w) H o0 h //Method - 1 N=100000 247s 7 B1 l6 Z8 |: J+ n) O, d! c
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& J& }* P0 C( A% {2 O3 c
) c: s8 v) z; I //Method - 2 N=100000 237s
8 v, S8 ~; c* X# Y1 i5 \ /*
* }$ `0 {4 A' l7 N% u for (int jj = 0; jj < N ; jj++)0 X( w( }$ Z, N8 I$ D- T4 u) S! W
{
3 y+ D: ^3 A- I) ~7 a, T2 R fresult += vec1[jj] * vec2[jj];
# v: Z2 k& ^" ` }
( t6 B) L e6 @: ^" i+ c */. |0 a. O+ ^7 j7 Q* o5 i
6 l6 X# \4 [0 w$ U* F$ N
//Method - 3 N=100000 204s
( b; H% p& k: N% t- x& C /*
3 i+ a6 b0 N( ?* z2 o8 i+ o9 V7 w for (int jj = 0; jj < N; jj++)3 i5 r A$ p4 z$ t. ^% |
{
8 n/ d% F& c, [7 M, I fresult += b1[jj] * b2[jj];
: [6 Z4 l6 i8 e2 r# W }+ G5 Q8 G/ ?1 q b6 E" ?7 {
*/
$ T, N0 p: s! R D4 ^3 c
+ T: N' q9 f# ]9 r! b //Method - 4 202s* _9 |+ C& l4 H( h. Z y
/*( l: q# V8 |8 T C* o) E+ ]
for (int jj = 0; jj < N; jj++)
/ ]; q& v2 v* C9 X( n; ] {
* d) H8 b, M/ P4 b( M: A& X + h4 o3 s" n8 U; ~4 @
}& P. Z& g' r4 B; u" E
*/
: l! E) x. k7 [1 j3 P //comment out all methods, N=100000 202s
" k0 A2 c; `. w }% T! f- j, M+ R o+ D7 y! d- e5 i0 U9 o
5 g! [7 f/ f1 P2 G1 I3 l/ ~ delete []b1;! V5 R5 W' e7 o$ M% d
delete []b2;
9 C( Y( Q9 i8 W" j" P: ^/ L8 k, c }+ n |
|