TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! G* O$ s+ q" X& W: c# U' s k1 [: t. K6 z
理了理思路,重新做了一个测试。
C9 W. C/ E X/ K' Q' b做了两个 vector 和 两个 float *, 都长 100000. C' s. l: A1 k9 N2 @& b3 W" J8 y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ N/ t. W4 v7 h$ |- m/ @
& w3 d% o% N3 e% Z; G6 Q
内循环试了4种方法,' j2 Q) ?- c* n' `/ `7 i# l: P
1. 直接调用 vector inner_product 247s / g9 m `) E1 Z; Z% o
2. vector 循环点乘累加 237s1 h+ ?5 w; U( f* P' t
3. float * 循环点乘累加 204s
" f2 x, f3 l; v& B! r |; \% Q4. 空循环 100000 次 202s
" h3 D6 _5 z* B% Z! t& @. |5 v, n! J l. ~/ [( ]+ M
不做内循环 200s/ N. q' o: D c
0 o& ]8 U! ^+ N) C( B你昨天说的对,内循环本身占比是很小的,大头在其他处理。1 E1 _3 ]' p* i0 C8 p* [; I" E9 w5 ?
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 L7 q$ ]0 S/ ~) @) f0 Z0 h, F
8 a7 }, S+ [( P* A- S' j7 B至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& E9 N9 w' R# I. c( l
7 {1 F1 t$ U: G
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)9 D; ~- n# ^" W3 |0 b1 g2 B
0 [5 K3 g/ V( t8 H
std::vector < float > vec1(N);
9 Z* u3 G8 {( g: ], T5 I0 W std::vector < float > vec2(N);
9 U( n9 q( K, r& | float* b1 = new float[N];! u5 j1 ]6 c4 n: m4 F: c
float* b2 = new float[N];) {0 Z' z8 L( [; F% v9 b! k4 f+ V
1 k# r7 @7 s% l5 S1 r3 @9 J for (int j = 0; j < 6000; j++)" R5 ?; f8 e' J: x( n8 ^" k8 E3 E2 U; l
{
! s2 b- e( P$ I4 f; }& [2 B* u std::generate(vec1.begin(), vec1.end(), []() {
, w7 e' ^" V8 w& d; x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ s9 O4 o/ A% q0 G/ q- u
});7 x" v2 L2 [5 e- w0 `2 x: Z6 j
# ]7 @2 D% {7 D
std::generate(vec2.begin(), vec2.end(), []() {
- N5 l. y- c$ n% m% O4 a3 G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' W7 u5 C. C* ^" l* {# g
});& M! A' p% V6 n4 F4 o
- a8 b$ _, p4 n1 v7 `8 { for (size_t jj = 0; jj < vec1.size(); jj++)4 [. S+ i6 A, A( i. R2 i0 {4 C
{
$ o- A8 J% u6 O4 ^ b1[jj] = vec1[jj];: ^, P1 H. |0 _
}
# q t. O- O: ?( A
9 A9 Z f; n) N3 \ for (size_t jj = 0; jj < vec2.size(); jj++)
8 t9 q& G/ X A {
6 `. F4 x* K! m Y0 t6 S/ }- p b2[jj] = vec2[jj];
2 H9 {. Q# y9 C9 Z0 }: b+ @ }* ?1 t ], x0 t H/ Q- q# p" ?
& Y& y B' K$ F: W2 t$ E0 f
//Method - 1 N=100000 247s
" C6 J1 v/ K! D3 B //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
x9 l! {5 t0 Z2 G4 ^: k$ p: V
% n4 u9 g4 A. \% i0 ?1 `. q //Method - 2 N=100000 237s/ T* }' q. N! K1 S% ?9 a
/*
+ w; g5 _# s4 C4 R+ l0 d+ r: m for (int jj = 0; jj < N ; jj++)& w5 x+ F4 ?- l6 B& C, X
{
9 Z2 [* o, S/ x y/ y/ ~ fresult += vec1[jj] * vec2[jj];$ c% i3 j' e5 c: ?1 J3 G+ I
}
; y# P+ }1 {& V6 x0 `7 A */
0 ^. T9 M( D7 n
8 |+ H2 J$ J2 v //Method - 3 N=100000 204s5 u. A- C+ g$ n
/*. _8 ~! @' U8 j$ n
for (int jj = 0; jj < N; jj++), A i4 \0 L% N0 R- o* T7 H0 R
{
: c" O7 j) U1 M fresult += b1[jj] * b2[jj];
# k7 g* F [* r7 I$ G2 ^. b: X: ^6 V } o3 X* X' b; y7 B& @; y, [1 T
*/
% v6 v6 v! v3 G" `4 l U" q
- }4 \) L. [2 q! h" O! b //Method - 4 202s
, N; z1 W2 F! H/ @, _2 ]% ?% [# | /*
. \: y" |3 c0 Z& F5 _0 w for (int jj = 0; jj < N; jj++)
\8 s$ a9 r9 D3 g) \# `0 |4 U/ r( ~2 K {+ o: @- m# n% j5 r' e% B0 T
" ~( j& ^1 ^0 U- K0 }9 q }* r" P5 A$ _* ]4 q
*/5 Q# ]' j- x( h9 }& Z! \
//comment out all methods, N=100000 202s
: Y* i4 F( s/ m }+ H+ K- P, s7 N! a1 z7 g
0 A6 L% U" c) T7 ^8 O delete []b1;3 ^1 o! S9 M1 E1 t% {% v
delete []b2; ) b1 F% P. n! P
|
|