TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) H9 n: h8 W; s( N# z7 ]# k/ O m# a
理了理思路,重新做了一个测试。; j% J# w( O4 n2 |" ^; D
做了两个 vector 和 两个 float *, 都长 100000' R$ j; N; U- Y' j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 ?# O# V; q% E5 L6 D, }2 {- @# ^( U8 U) u
内循环试了4种方法,
/ T. B! u: h: g* r/ ^1. 直接调用 vector inner_product 247s
' @4 k) ^8 m" L/ }2. vector 循环点乘累加 237s
' h k% u8 v% k( r7 T' ^$ S0 C. W3. float * 循环点乘累加 204s* w, f3 k2 X4 |+ O& V
4. 空循环 100000 次 202s- u' Y! t( |" E. ^' K" f
3 H* ?' p6 o* ~" q不做内循环 200s
' N" R l# G0 R- `" x9 j4 s- E' K, N# X; ?- s. a: P, W9 \
你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ a. i) q! c; [) Y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
5 t% L, _! @2 q# h* j7 s& r# I% w( K9 m9 d/ [/ m! j8 ?: H
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- ~( j' ~6 W7 }
" C! E# m* S) e: A. A(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
$ f" r9 c! e2 c5 ?4 u
# D4 o7 ~0 p$ { std::vector < float > vec1(N);6 N3 k9 T& o; k
std::vector < float > vec2(N);
4 n$ t$ s" ` ` float* b1 = new float[N];
9 t4 L6 ~6 Z1 N1 K* c! V* l float* b2 = new float[N];
$ V( T* T7 B8 M7 [" C: k9 `; x' X5 c# _: D. X3 n9 z
for (int j = 0; j < 6000; j++). n7 u: L% k( J7 f$ W3 E# \
{
9 V+ t' y. o2 C. ^5 W2 d std::generate(vec1.begin(), vec1.end(), []() {
5 g. y4 S! k: h s: N return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 w$ f Y n' ~
});
1 [+ b1 H d) p3 N- r- ]) r$ [( `, W4 z& ?* D6 A1 e0 i
std::generate(vec2.begin(), vec2.end(), []() {
. J3 @/ N$ M' R9 U( W \ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; W: [: P1 y0 M( R
});+ b8 E6 y2 C4 L$ Z E
# K5 i/ u& n6 W: ~' @
for (size_t jj = 0; jj < vec1.size(); jj++)
9 _- e7 H( u. @+ @ S4 C0 g {
% R% E9 R' ?1 I) Y3 D6 Y# ^# K b1[jj] = vec1[jj];
7 i8 v. f$ x; e5 X) ]; F }% l* ?' {; l$ g; u' i
" a! L& b. A# i. D for (size_t jj = 0; jj < vec2.size(); jj++)1 ]. V. ^- @9 O
{
, ^ ]6 F; }: x" q- m" V. D4 ? b2[jj] = vec2[jj];
) { m; e! A B* k }
* A, }- t L' W2 z
4 P* i, u9 O2 @' y% {! X( N! C/ Z //Method - 1 N=100000 247s
7 d& R8 L1 z S) j7 {" ] //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) h$ O& A/ e6 B; H8 [! [7 _
% X- k9 p8 k( e) z# ?
//Method - 2 N=100000 237s" {1 k' Z8 l7 y6 G4 n
/*1 k# t9 [0 E5 \1 ~; Y
for (int jj = 0; jj < N ; jj++)
$ V5 ?/ a% \" U7 Y8 d2 T {! Q, a( _' s, ?9 q, s( w3 ], i* t
fresult += vec1[jj] * vec2[jj];9 J! I% b& i" u! E: H
}
; O, w9 n7 Y8 R/ C4 r, P */! j9 Y, T) y/ p, Z& b6 j4 k! O
5 N) g9 N) h0 J //Method - 3 N=100000 204s
' `% W9 k/ N3 j. K% t/ ?9 ^( ^/ {# [ /*
" j" ]9 d" {* r# Q0 z for (int jj = 0; jj < N; jj++)
' C# g! r4 j% T ^& r {% t3 V/ m2 I1 ]9 s
fresult += b1[jj] * b2[jj];
; F! {; {$ Q& c% k* f8 ]! P }
4 R& o J& Y1 n4 H% b& b */
2 z6 H: [( j! q" y3 I) g
' D: [% ^9 \. k& k* w1 B //Method - 4 202s: \0 w3 q! Z$ A) m
/*
' w% @. [+ m2 { for (int jj = 0; jj < N; jj++)( u" A. `& H+ _. `
{
' c) X3 V4 _$ h9 w% D' _ J1 x* O
# V% D6 S- n7 L" J+ Z1 c# l2 |. S" K. E }! e1 B2 ~9 c$ H* N# o/ J
*/& Z4 o$ B) ^( o# T" g" t# V
//comment out all methods, N=100000 202s
% H$ z9 ]/ K+ T* x }9 c) S5 ]/ j0 S1 w) L2 C9 u
$ \. e! L$ f& f: I6 [- V7 Q+ D
delete []b1;' G1 p" S' w6 y0 p; Y& {2 z9 s! O
delete []b2; ' [* ]" j( E$ ^- N P$ u ~
|
|