TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 z8 q+ B" C# f
H# y |) a9 p# c w
理了理思路,重新做了一个测试。+ b) W$ k( H" a" o9 Q2 d. h
做了两个 vector 和 两个 float *, 都长 1000009 p3 ~+ T! p6 f& e3 ^' v
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
. U* I: G. X2 [8 E% L
2 r; B: s( y1 B2 x ^: m! H内循环试了4种方法," I) A/ D* Q6 j, d/ A, \1 s
1. 直接调用 vector inner_product 247s
5 S9 g' u$ ?2 h( W; b9 J8 T2. vector 循环点乘累加 237s( { S p! J; a6 t' ]
3. float * 循环点乘累加 204s
" _4 b# a1 ^' f5 R% U( e4. 空循环 100000 次 202s
9 u8 b4 m3 g, s# U; X# d' ] `9 D! V# I1 m. L) _9 p4 N
不做内循环 200s) K' V# S& U, z0 ?
& @ z8 m7 j# P# m/ B你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ L1 s% p3 _* r7 v" w( v- A另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* l) r- W! [4 S6 u9 ~7 P- g9 p
% e/ m n7 r- |" A
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
/ v+ S" J" U+ c. n1 u. V" i( e. ?! w; |* W
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
$ V6 E( ~" l6 D/ ^! \6 V. A6 k" A" ]4 c/ Z
std::vector < float > vec1(N);
0 d$ w- U1 Z) r, @: E# T# n: @ std::vector < float > vec2(N);
) N3 B7 w9 v+ n5 g+ _& P J float* b1 = new float[N];! c. L& h- l8 b: x: x5 N
float* b2 = new float[N];
8 @$ ~2 _5 _- l- ]
* p( h+ z; |+ h! g5 q for (int j = 0; j < 6000; j++)
v) M3 _# u/ a' s9 X {# I4 v' D1 P6 i9 I
std::generate(vec1.begin(), vec1.end(), []() {
8 h/ w0 T8 ]3 `- g* g9 ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
9 J$ R; O# n! H# k$ f! T });
' z* ~+ q; ~- A5 e ^ M- |8 E2 l- K9 n
std::generate(vec2.begin(), vec2.end(), []() {
) G; t, _2 e. ^4 u1 j return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
5 s" W* O; b% D });- p- p5 w8 b/ Q" J) Y [
2 r0 D: |! F" c5 {& ]3 h1 M for (size_t jj = 0; jj < vec1.size(); jj++)2 `- U B1 F2 y( n* m
{# U( s7 q% \5 ^6 Q
b1[jj] = vec1[jj];2 l6 x* w; A3 `5 P
}
/ k3 }8 e" `: m2 `3 k* ]& p7 M% Z& n2 N. M$ f
for (size_t jj = 0; jj < vec2.size(); jj++)# g5 U/ L n* d9 Z- Z- a, w/ K
{9 B6 u4 k7 j. k! Y
b2[jj] = vec2[jj];
/ e; g- Q* S4 ^# E: y }+ V/ Q0 V A! L1 F0 }6 m# t& ]
- U# o9 D6 G2 H* C1 K
//Method - 1 N=100000 247s
9 i, w( @) H! w5 x. _ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ o2 j! q) ?2 _, y. D# u
2 i. N6 X4 W# a! M g4 ]$ A, g8 W //Method - 2 N=100000 237s
, l8 j W7 v. U9 b /*- z4 x+ O3 i @5 u! E: o2 M
for (int jj = 0; jj < N ; jj++)
& U$ M7 D; C5 J( }1 o4 K9 Y( h {
4 A+ _$ {# ^0 C: U: m+ q1 G fresult += vec1[jj] * vec2[jj];
2 c9 x" `% n3 ^0 E/ o }
" r0 ?4 M( C* S1 ? */
G4 i/ l M5 x! e8 H1 q 2 H' T2 `6 g4 o( e" C1 R' E
//Method - 3 N=100000 204s
) |! S. ?" N% @' S /*) g! N# r) T' }6 g
for (int jj = 0; jj < N; jj++)
# v) W! F, H" B5 i2 Q# o& k! b8 Q {! o* C3 q/ ]. H: h4 p
fresult += b1[jj] * b2[jj];, ~' o% }8 Z# F5 J, x5 t( W
}5 O' C9 ? m: ^4 o1 ^* V
*/
: D7 N8 Z# `6 E3 M4 ^) a7 w
6 O% X7 X' O/ P //Method - 4 202s, S# J+ a. J' t3 t" J+ v
/*; W4 C; m) Y& }) s5 O1 Y. U
for (int jj = 0; jj < N; jj++)# r: f' d3 b4 P4 D; o: X% ^: I
{
! l! @0 f/ D6 R; @8 ?+ r3 X
, T$ e, C; `$ ]* V8 N } Z" b" E6 w- p3 S1 ~9 X2 Z( r
*/: Q6 j3 s M! \& l) C! ~
//comment out all methods, N=100000 202s 3 f; L2 D5 I7 G0 K( n
}' e5 x1 K; m" B& U: A' m
+ c& Y( k7 T9 `, E( w: B7 z
delete []b1;2 L6 ]# i8 W4 A$ N& p7 X
delete []b2; _" ]" r" o1 x, Y& }6 X& D
|
|