TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 u6 U2 N' ` H
( x. ~+ C2 H, { A _2 o# e: t1 P理了理思路,重新做了一个测试。
, D" e9 a9 ~+ e4 S4 ?5 x: L做了两个 vector 和 两个 float *, 都长 100000
" s& ]/ r; N. s# c" A5 q& R外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" `" W& P F$ Y* R! U6 z- Z7 {3 W8 {$ i" l* Y( O/ l
内循环试了4种方法,$ T% W' r) B) v# r
1. 直接调用 vector inner_product 247s 8 ~% I/ \& t! y* d% [
2. vector 循环点乘累加 237s
/ R1 A% r% X+ I1 r0 H) N3. float * 循环点乘累加 204s
' F% P$ q; P+ _4. 空循环 100000 次 202s5 |$ ]7 {/ R0 C5 {! O7 ^/ i
" w3 q: q$ f& j2 Y
不做内循环 200s* `. G$ J9 u4 L/ C: {6 F
' \$ ^: u2 O( s% y( }" g0 w你昨天说的对,内循环本身占比是很小的,大头在其他处理。
: r" {7 [- I" Z- u# p" s" D另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
% @0 F) W, L* n+ J3 l# G& x& U
1 V% h( g5 @9 X1 g* A5 Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
# y$ I! n' D+ h$ y: U$ S6 y! K4 E- Z3 q& o; _+ m
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), G6 a: g+ i# m9 t! _, z* O( W- C
* N, O. G7 @8 D( ]* o" e! O std::vector < float > vec1(N);
7 b( u3 p+ [# M ?- M G std::vector < float > vec2(N);( E9 B8 f- l5 l* U y
float* b1 = new float[N];) ^$ ~! M3 `, y- C+ d4 G
float* b2 = new float[N];+ {4 T9 U" o) W3 a' j
4 j' S( O6 [' {- i8 W& h! Y
for (int j = 0; j < 6000; j++)
, v8 G4 D, `% r( a$ a) ~ {
* ^, R7 G0 J$ `- i* i, R std::generate(vec1.begin(), vec1.end(), []() {
4 ~" ]2 c3 V& ?' K0 H$ u( G1 H return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; e ?/ M" b7 _4 y4 J
});
" R. h0 X# v8 ?- I( M( V$ L) W
* h+ K( K) \" ^1 {6 _ std::generate(vec2.begin(), vec2.end(), []() {
! p/ b; x8 r% @5 Z7 |3 q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& t- F# q- D2 M) g4 c/ I* Y
});
0 G) P2 c# H2 ~0 m
. Q P$ x+ _( Y for (size_t jj = 0; jj < vec1.size(); jj++)
. C7 b8 d( w( A( e. x {1 G- |1 T% l7 A k1 K/ t$ j T
b1[jj] = vec1[jj];
+ I0 N. [% O" Y# W$ z }
8 b$ s2 `/ O9 t* A1 B5 e2 G E2 C( ^, K, d; u( {& J
for (size_t jj = 0; jj < vec2.size(); jj++)% y7 W4 }* V& G- P$ l7 _
{8 S" S* G8 X/ S& m- S
b2[jj] = vec2[jj];1 s2 `# s' S" X% w
}7 R6 ]% [- Z |3 [& S
% ~) {) k4 E* j$ O5 t+ u9 L& x
//Method - 1 N=100000 247s 8 B v! Z( k9 B/ A& H7 Z
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 w$ u/ V9 ?( ^, Y
5 M' q4 J! T* W //Method - 2 N=100000 237s
4 d! `( s6 d/ u K( t) Y' A /*0 S0 Z; J* [( k" I0 {1 `
for (int jj = 0; jj < N ; jj++), M" d% o8 P9 K% l9 I* b
{
) U6 @4 \" h: M+ }: z! v" M fresult += vec1[jj] * vec2[jj];
% k V8 u. a, }; T' V- [1 C }% J% Z2 B' t0 L' M: a: Q
*/$ f' N2 l9 O' a* @( @8 N
. |9 q4 c# K* W% s$ Z# m) G
//Method - 3 N=100000 204s0 l" Z6 u5 s, z: i/ t }* M
/*
; y& J' v& M+ k for (int jj = 0; jj < N; jj++)* I) h: d/ q7 x$ h7 k# K
{
& Y1 H2 g* ]/ T$ D# F fresult += b1[jj] * b2[jj];% R9 X6 c7 L( p* R$ Z
}( x& E4 R @0 r* Y+ F
*/
) z) k8 ?# a" ]& H$ P _4 N$ m+ O1 J4 A6 R# ]( r) ?* K" p
//Method - 4 202s
5 k9 u) ^1 \% n; v6 A2 L( L /*" C a* C3 @+ x9 F
for (int jj = 0; jj < N; jj++): `' L/ y+ u( t8 m$ d% b$ n0 ]
{+ |# a6 A( Y/ N( ~9 `( E2 X o
/ E- e8 X( E/ }1 h2 Z) y7 m5 B }. f, ]6 H8 J9 ~0 r+ L2 o
*/
5 V k, r/ s- @8 {/ M1 R //comment out all methods, N=100000 202s " t! M, z' z6 [; m* [& u
}2 S/ b* ?8 ?/ I# Q" @' B( H
; Y1 g6 m" e/ Y8 x: `& { delete []b1;7 O0 a! z6 p- N, I
delete []b2; . ^& `7 e: J9 e" ?. _6 J
|
|