TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
9 g+ j8 F% L- q
6 T$ \/ T* w- ?# S1 y' ]理了理思路,重新做了一个测试。! z% c0 s$ `& }1 z8 h
做了两个 vector 和 两个 float *, 都长 100000+ K* p# d7 I2 s. J
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.% v0 a5 B% t& I/ r! m
: H* i6 _) G" y9 b X2 J内循环试了4种方法,
" Q, W- a4 d" B# e: |1. 直接调用 vector inner_product 247s
& o; e( G m3 E' l# z1 p* m' A2. vector 循环点乘累加 237s
2 W/ A$ i. S8 Q, j4 O3. float * 循环点乘累加 204s+ ]! \7 _4 S6 [' A
4. 空循环 100000 次 202s7 `( E# T R( E+ `% V1 u3 Y' C
: Y a' Q( @ C- S2 D- I8 R
不做内循环 200s4 m2 m8 O: r) t
' T8 y( [3 F) S* {( E* `) u9 C% v \你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 U! ^ X# Q* \7 G另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 M- I; U! e& k$ v# ?' R6 d. e
8 H1 x3 M3 H: F
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% I4 A* \+ N- s# b- u3 V$ @( E( ]* |
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)' q9 s8 z" K% y! t1 w
1 |) b/ P5 u5 p" s" n1 B$ z( J' y std::vector < float > vec1(N);+ _* V( R1 P0 w1 z
std::vector < float > vec2(N);
, Q! G# Y; a; q; c float* b1 = new float[N];
S* ` b' B h float* b2 = new float[N];
+ v( S; b4 f6 a$ Z; S
* f+ E1 K0 Y7 A9 G3 V for (int j = 0; j < 6000; j++)% |& Q4 ~$ B. J5 W
{; r. `$ X6 [; u6 ?( V9 ?
std::generate(vec1.begin(), vec1.end(), []() {
# s% O0 }9 ^" J, [% w) `. r. | return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, b$ a* [# H* H9 A8 u
});, l* c' J S! S1 N* @
+ N- c# W, j" @
std::generate(vec2.begin(), vec2.end(), []() {9 l6 l! m6 h2 v6 u
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
2 ~" v( H4 k: f/ }/ j });
* S, d0 M, z% T" n$ V- F; L1 G3 e# }
1 X/ ^! j3 ]$ v$ T0 q1 X for (size_t jj = 0; jj < vec1.size(); jj++)9 g M$ Y- {0 Q7 u6 T$ F ^
{
2 [" ]+ F$ Y/ z/ o% ` b1[jj] = vec1[jj];
7 R" b' O- H, h6 C7 d; E/ Y1 f }3 t, h* Z) z: }9 u- a, c/ c
- i' Z l7 G, a5 G7 z* m* H/ g
for (size_t jj = 0; jj < vec2.size(); jj++)
' Q, ]1 O* K7 h# j$ [ {3 x- C2 d3 |( |* t" c
b2[jj] = vec2[jj];
8 G C+ Q0 u# y7 h( u' D) }+ E }. X$ q- C# R& ?. e5 V- Y- r3 ^! g( e
+ K3 }8 {' U: b R. ?
//Method - 1 N=100000 247s / k, N- i( u4 f% c* `4 c: S
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 u9 {% ~$ `! I: M7 d
0 b' _, s% ~/ u; Z! N
//Method - 2 N=100000 237s6 u; q5 ~% W6 i- q6 |
/*9 a) P, O' L/ z7 S/ c
for (int jj = 0; jj < N ; jj++)& h3 w, _) O4 Q6 _5 P, c$ N1 }! [
{
" I; o7 k! d" y. P, _ fresult += vec1[jj] * vec2[jj];
" m' O! w: v5 U5 ?- Q }
1 F3 }3 b" B( Q; C */* a3 J* z9 n6 y; r) U. c* c6 r# ?
; @! B3 J; z* F) n$ ` //Method - 3 N=100000 204s o# G0 {( u! n
/*
2 B1 C. v+ z% [& @/ V: d7 u* [ for (int jj = 0; jj < N; jj++)" n9 {/ U/ B$ M$ {( ~. R
{
0 A; [7 A6 G( ~7 @: n/ U fresult += b1[jj] * b2[jj];
9 T5 P* B H+ t# N }
4 h% v3 F8 \0 |" |- n/ s2 w! F. k */7 N4 u+ j( T @: x
& I. D) B4 e Y" w* Z4 Q! Y //Method - 4 202s R) B; [" T; j" |5 t: ], x
/*
5 o0 n4 r' e# D# i( ]* M6 I' _0 o) Y4 v for (int jj = 0; jj < N; jj++)7 m$ C8 w& G0 d, h2 _; M
{
3 u: w0 j6 D! z
+ X% H8 E" n3 I# [ }
2 |2 z, C8 N }3 Z9 c4 R */
! z: n) F8 w0 S' ]: m //comment out all methods, N=100000 202s
% s0 m2 V! z3 h( t2 O }
% S- y: l1 a: x% H2 l) V4 E
6 D. M9 c% z$ r9 n7 O1 v' K. x delete []b1;
" z3 Z% J/ z) v& \% p delete []b2;
) k- U9 l- ^$ z9 R9 x$ c; P& g) W6 R4 F |
|