TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + R" t8 Q+ f: Y ~1 ~# @
: i1 O3 C! t' Q% I& }理了理思路,重新做了一个测试。: G* ?4 a; b5 O4 f3 |' N( N
做了两个 vector 和 两个 float *, 都长 100000
' I- u) w" m/ N8 d& m; y% y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 }* `8 j' _1 o2 K% k- x1 L
0 R! l2 ~& w- b& l0 c' Z内循环试了4种方法,6 U6 Y! B B( m
1. 直接调用 vector inner_product 247s c7 s- i2 i; M O! K! c' @
2. vector 循环点乘累加 237s6 M3 p5 M$ P/ _4 k# [
3. float * 循环点乘累加 204s% u0 \# T0 K$ j" g4 A) a
4. 空循环 100000 次 202s5 [7 h! Z3 p$ d/ p) M8 H
! v/ ]% }: [2 A% n, a: T* t0 i不做内循环 200s
' A! q4 b6 F- I0 u
/ q0 O0 R% u8 F' D, w& K3 z( k& p/ F你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, R9 w6 b8 x) w, U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
/ `0 S6 j$ M! {" Q! G$ m
3 g) {9 V5 Z p7 {- o7 r6 E7 O. K至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" g% u7 a& a+ c& }
# z1 B. X- Y; r( d! ?
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
" M9 n4 b) g: w# s+ S! Z M
" u t: I8 F$ f/ ~3 _. Y% D3 d std::vector < float > vec1(N);, S7 ?/ V6 ]' e* c9 J3 M' N/ @
std::vector < float > vec2(N);
- @9 [% V9 h3 m+ m6 L! l3 x float* b1 = new float[N];
# ^# {5 b$ {0 v float* b2 = new float[N];
8 c" d: Z1 I0 ]3 k6 j4 d, H! ?7 s. G" E- A% [8 b. d9 [0 P0 |
for (int j = 0; j < 6000; j++)
6 @8 o4 d5 T% _( g& b: J {
0 u' r' E: D, I" c std::generate(vec1.begin(), vec1.end(), []() {2 J5 ^( U# I2 W: Q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
5 I4 ]# h0 n& D8 t- q! |; K! \9 q });* F8 _2 Z" N7 w. l( _; I: H/ c
* o$ a( Y- M/ S7 L4 {0 q
std::generate(vec2.begin(), vec2.end(), []() {3 c$ o3 H* w( `
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 T$ e9 T& h+ G, B
});
; U% v6 m1 q* k3 u$ T' F
0 T: z0 ^) A2 }; Z$ v: h5 d6 G" r for (size_t jj = 0; jj < vec1.size(); jj++)+ B( p9 C0 u/ q' H
{ J* L% C: ?% r
b1[jj] = vec1[jj];
+ X4 q' R/ c4 k) l, T' m1 T% N$ z) [ }
' B5 A$ ~& b- s1 H3 o9 i- V' Q9 O- w! _5 {7 \
for (size_t jj = 0; jj < vec2.size(); jj++)1 V+ Q D! j; u- @ T- x" K
{
- w' p4 J5 h5 A \" t9 z! O: h/ H4 L b2[jj] = vec2[jj];
0 H% o0 h7 |: }. Z: { }
: J% g4 ~- _" V1 A( b) S, C* u* a# y2 O3 U* d
//Method - 1 N=100000 247s
( h5 y0 p/ W! ^- M. ~2 d //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# F9 M# e8 q8 C( D2 h
& v) A2 Y0 ~1 f //Method - 2 N=100000 237s
/ r/ t1 r0 q8 L /*
% D) C7 p+ [$ [; m( `7 I( H for (int jj = 0; jj < N ; jj++)
* R: z, t' `; l8 x1 r {
+ F3 a* _- |0 R; l fresult += vec1[jj] * vec2[jj];
. _ ~# r6 s0 [ }: c- B: @! S& y7 d
*/
% K% W, b* V* ^
7 Z A) U" P1 |/ Z) j# m //Method - 3 N=100000 204s: j n" F; q- `( D. C
/*
6 N" w, ^1 U0 I) e: Q' x- | for (int jj = 0; jj < N; jj++)% i( z0 x" ?+ l5 r
{
; b1 b4 d' C/ A7 W2 m1 f fresult += b1[jj] * b2[jj];
6 c$ ^2 T# m6 E. J } G# d) L4 Q1 b' e7 y
*/6 `7 r/ t) U* J5 w: Q$ t
5 b) G2 }! M9 ] //Method - 4 202s$ R' u- |8 q* `# i" n! }. k
/** L+ ^# K( |9 i) K: }+ v
for (int jj = 0; jj < N; jj++)' S# B3 [5 f2 u) h0 @7 M2 G
{
( R' Q9 `/ O4 C1 r( a
( v0 j7 Z2 k3 T2 i2 O- X( B5 }/ V- U2 X }
! V% f# V/ G: G2 c */! Y f; e( o. @. {0 A! k
//comment out all methods, N=100000 202s
2 V2 D" Y6 |$ S, h }
% t0 U9 r4 a }, F
2 P" ^. e5 P4 m% }9 Q, u delete []b1;4 F# A; S" z9 f8 k& C/ t; O7 I# g
delete []b2; & ?" V5 Z- ?: B& C0 p
|
|