TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 1 F* ?3 G2 ]- r4 \3 I8 z: Z
' S6 L0 {: W% x4 K1 A2 f3 n
理了理思路,重新做了一个测试。2 Z% i8 v' }$ h/ c
做了两个 vector 和 两个 float *, 都长 100000
7 ~! T) n0 d5 ?) `( A外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
8 o5 ?( n! Z: ?( G- r9 {3 B0 r2 {; q) U! M
内循环试了4种方法,. ~2 H4 `7 I; R1 P M0 m6 `
1. 直接调用 vector inner_product 247s
+ N* y8 A& F7 b! ^: a1 m: Y0 O2. vector 循环点乘累加 237s
" ^" }; M" s6 v4 C3. float * 循环点乘累加 204s
% H" [' m% E2 S# K% F4 }4. 空循环 100000 次 202s5 n& D' G1 l7 @1 m; e
# I( q8 P& [2 f不做内循环 200s
- K3 u0 A" S2 L# }
C- b$ b* s6 a/ l6 w) s你昨天说的对,内循环本身占比是很小的,大头在其他处理。
% {8 f0 F: h% T- J/ H另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; x% r \7 m* Z9 s% \% b% ]# |
0 ^5 k7 {0 s7 e9 i6 v9 y# [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& q5 s, ?' p. W! ^' \8 k
, ~ O/ |' f9 s* [' @
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- o/ m7 d( @/ L1 L
. X. X, t% b4 {
std::vector < float > vec1(N);
( u- b# [6 ?7 d) I; r6 [9 R std::vector < float > vec2(N);& I" v4 M2 M* ?" d" L/ D# F2 ]% E
float* b1 = new float[N];5 W# H3 J0 _$ X# Y# [( C/ X
float* b2 = new float[N];0 R! ^! D Q: P, h2 a
! Z3 G) o4 g8 A for (int j = 0; j < 6000; j++)
* S4 H- J" P8 U3 Q# q9 s- c2 |1 t {! h0 a6 B% s: y! V$ o
std::generate(vec1.begin(), vec1.end(), []() {: Q8 I# D* p0 _( B
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 [ d3 _5 L& P z });. g! L/ `2 ^$ V/ @) f7 O0 c5 I- W
# E9 z# [ I( \! O9 a7 u1 l
std::generate(vec2.begin(), vec2.end(), []() {. J2 y, }3 a; c( b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
: q/ A L D8 v, W3 }2 i/ v });+ [; B% b2 T2 |4 _6 j& W5 {+ q b) `
3 o: G, F) U% [) Y3 n: f for (size_t jj = 0; jj < vec1.size(); jj++)0 K x# n" _0 [
{, d$ i6 s7 l5 p& e
b1[jj] = vec1[jj];+ x4 |" i) d8 u! N
}+ D0 f' ]6 O* e1 R, |
* n6 Q8 n' c* b for (size_t jj = 0; jj < vec2.size(); jj++)* L* E+ x( n/ H) g& }
{
2 \( \. L( R c' d' K" B b2[jj] = vec2[jj];3 j! ]/ f5 b) K- G
}
# [8 x8 H2 g5 Y" y+ Y9 A7 D- q7 `7 _3 f, R5 t
//Method - 1 N=100000 247s
4 c2 H6 }( |, p //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ W0 L: t& }. H 7 i o9 T6 j8 l# d4 ]
//Method - 2 N=100000 237s% k; X. G3 y$ W) o' N& w
/*% J9 O/ A) n% G$ B2 m" ^
for (int jj = 0; jj < N ; jj++) Z% A: `/ `: y9 Q. K2 h7 B1 d
{, X( {* ` R, N
fresult += vec1[jj] * vec2[jj];
; j4 ^4 E3 m, h# v! H; u* l }9 V- P( J1 o7 K/ P( g0 v6 }7 E- Z
*/3 M; z. d, x" v- U# k9 K7 D" _
5 E5 }3 X$ v- L' K8 D //Method - 3 N=100000 204s
( c4 t) S3 _) ~2 }5 `- c; z6 o /*
1 q3 n# C" `( G5 R3 \: g+ R for (int jj = 0; jj < N; jj++)& }/ J9 K8 F8 ~7 [ c; S D
{! s3 ~+ i4 Z. N
fresult += b1[jj] * b2[jj];, T. }2 D3 h2 P, a; A
}
% K& _/ R% f+ b& j2 Y2 G$ p$ m */% x) b( \" F; L8 N/ m9 I
( w. d4 {6 _8 N2 d4 _ //Method - 4 202s6 g* z# l$ k" U! g3 B# @
/*: k( ?5 x# P1 }8 J! [
for (int jj = 0; jj < N; jj++)
0 L8 ^# }: h- w& Z {# M( H7 m; d$ H- E3 b A, |
% m$ q+ J- a- c1 H4 s
}
: R5 n& k) e8 \4 L */
2 ^( Z+ o) j4 q" d( R- E# d //comment out all methods, N=100000 202s
0 _( W# Z0 g8 u3 D* a4 S }
- `9 S) I& _( J$ n9 t- L. H0 U" J+ M; T' `
delete []b1;2 ?! B% o1 X% \, k9 T4 T
delete []b2;
, Z& F& R7 g, U8 T, r, u: v |
|