TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + P4 L6 N+ {2 |+ t; U9 q7 C
' p+ } z6 v, k* u理了理思路,重新做了一个测试。
4 R& X# \' G0 k* N$ S做了两个 vector 和 两个 float *, 都长 100000# T m* V2 B: [! w( P/ L R) E
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 \' h1 P. J" a& W
' \7 V0 N8 z, f+ k- f2 k p3 `$ E内循环试了4种方法, a8 _, ]1 b! i, E
1. 直接调用 vector inner_product 247s . A( N0 P$ q7 _9 ~ w
2. vector 循环点乘累加 237s
8 x& U( A6 R A3. float * 循环点乘累加 204s/ D, L/ o/ U8 e. f& J+ }
4. 空循环 100000 次 202s: g" a: S8 Y8 ]+ b
: a& S0 h0 w& D+ @6 Z
不做内循环 200s
* W; R1 _4 o0 T. A
# W$ ?4 k; D( r i |$ F, ?3 [& e你昨天说的对,内循环本身占比是很小的,大头在其他处理。
/ s) c4 {% a8 }2 J! k另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
7 F9 \: `8 b5 h% U+ Z# l
* `. q% K! c1 {/ g# Y+ y% v( }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* y `" r. b* P
4 R, ^: V h6 p- ^! D
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* s- V. p' a! P- y* e' {7 e
) L+ [/ I( i8 |; @ std::vector < float > vec1(N);$ _# ?0 M% M2 }' q2 f# ~
std::vector < float > vec2(N); w4 b% y0 D% d& _
float* b1 = new float[N];
$ I m# r: @% K% I/ U- E( V float* b2 = new float[N];; @3 p2 u) G6 M# I# v8 A% R
2 p% I- N9 Z g$ E' U
for (int j = 0; j < 6000; j++). P9 A8 E* |9 C! J
{
: H3 K; Y4 [! |7 ]; Q std::generate(vec1.begin(), vec1.end(), []() {
5 H' |+ f8 w. f8 K, w/ o return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ k' O+ c/ H# Q+ p6 B. v4 F
});
# d. n" V5 u# a9 j. a% T# j2 y
2 Q* p4 O t3 z2 y9 e4 H! L std::generate(vec2.begin(), vec2.end(), []() {
( ]; [- N& }, F, S% P/ y- } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! D, ~: k4 a# Q& o
});
6 ]; @5 l( n# B3 @3 P
" A g! C# R1 s+ R. r for (size_t jj = 0; jj < vec1.size(); jj++)
7 Y/ p( `8 A3 t! o/ P O( K7 f {' |/ o! h( x+ }$ A9 J3 L- I
b1[jj] = vec1[jj];5 W2 N6 j7 f! b6 Y0 I7 [
}% \" q. \8 [$ Q
6 {& c/ o( r9 a4 a2 K& p6 y for (size_t jj = 0; jj < vec2.size(); jj++)6 n7 {2 S J! n3 }. |! u/ N6 Z' E
{( e& M* T! e' g0 M1 ?* c
b2[jj] = vec2[jj];
; A0 O! W+ D1 N$ n* v0 w% P7 D }
2 W5 y% O b4 Q, _' Y& @5 o9 ]4 R1 X6 N4 F1 B
//Method - 1 N=100000 247s , j1 P, U: A; [& e/ Y
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 s6 o$ ?, \) K1 }. Z& W1 ~
3 [' l0 @, u. i% r& |3 H2 z/ c //Method - 2 N=100000 237s( g( |9 S( C9 H9 p' _
/*
* p& C0 R1 d2 r4 l0 ?' A9 y+ J for (int jj = 0; jj < N ; jj++)! G6 b( Z% \/ ^, B
{" c% \/ |: s* E4 `
fresult += vec1[jj] * vec2[jj];
( p H. m& I, p% A9 }# m }
2 g' \% D8 h2 _6 @5 k6 } */
6 Y: B1 ]! y6 \' z - z3 R4 h! C. _ ^* a7 {) j5 K% \
//Method - 3 N=100000 204s" i) x! f9 a3 {7 O; O( i" ]
/*
$ U8 }/ b4 D! P- q" L# f% A& r for (int jj = 0; jj < N; jj++)
& G8 _$ u4 B- c' W {
1 B, X# q. e/ m5 b, k' O7 u# b' e( _ fresult += b1[jj] * b2[jj];9 z O0 Y& R$ J, ?7 X5 l7 j: H
}
6 y% A+ Y3 M/ f/ y7 x% l */
0 e1 {% R1 W2 \% Z; \
% @, z& V q9 g* _ //Method - 4 202s
- u. O1 a! k3 q [6 z, W0 F /*
$ Q8 U3 ]7 n$ ^5 ^( y5 |/ v; m for (int jj = 0; jj < N; jj++)
! e7 e. R7 \; o! r: |7 r* l {
) ~9 m/ z' ^. A( r m9 }
2 |9 n8 b, \- S7 n+ B5 B }# A% x) U4 S* @& F- n' J
*/. \; J# Z2 B# ~" d* n
//comment out all methods, N=100000 202s
! M: e& C2 E$ m1 ?& A }/ t; K' L4 m, m7 j% n
1 ?( h, X& ^8 l, F5 t: L delete []b1; f, E9 U5 }7 A+ R% _
delete []b2; 3 h! Q: x2 w! j/ [) N
|
|