TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 g, H8 L) X$ W
; k3 p y5 }4 P) }2 Z* G理了理思路,重新做了一个测试。! ?% f& g# e2 W8 B. n9 \
做了两个 vector 和 两个 float *, 都长 100000
: i0 p2 d! j/ X+ D7 O8 L8 @6 B外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
; E+ t* b8 `% Y- @. o0 |: K- u! y9 `, [
内循环试了4种方法,) u* l3 h* T) E6 x' W( ~
1. 直接调用 vector inner_product 247s 5 n! e* a* f4 \; b
2. vector 循环点乘累加 237s7 E6 R5 A) [4 z0 l* w. J
3. float * 循环点乘累加 204s
/ ~4 R; H0 @* E0 F- w! ]4. 空循环 100000 次 202s
* L2 u* e' u4 Y# e6 V$ L! e
9 |# g6 n) e! f) U不做内循环 200s! h* f6 s; y% [4 q' H" g$ c7 y
9 N$ Z/ D) O- \ i* v% c" \
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( q( A: K2 ~- G1 y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 b2 ]' o5 \. S# Q o
+ I0 o0 Y7 \; y" f3 t. _( `# p. c1 A至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ @- b! W$ v8 j3 H
$ d( @0 p9 U1 U5 s0 l(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 [3 x3 [- G8 i* D+ O3 _
6 j0 E! I1 ~* D$ B5 W
std::vector < float > vec1(N);
- h6 x9 g- _- R8 H std::vector < float > vec2(N);
) a' w, P* A! V float* b1 = new float[N];7 _" A/ [3 d2 b* q) u6 q
float* b2 = new float[N];
" M0 C' G1 V& E' \% K8 E% d6 d. j; A* @. L: _* n1 h
for (int j = 0; j < 6000; j++)( |7 `: X; ?- L% \$ m5 x
{/ @3 X5 c) o" u' o- y3 E6 l
std::generate(vec1.begin(), vec1.end(), []() {
* R7 g' h6 f* F; T, E: q6 q3 @0 @ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;9 [, k8 E3 Z9 n2 m' {3 \* H
});
" ^9 k1 _# ~' c! E) A1 {! `4 [8 f, b5 D5 h* M* d
std::generate(vec2.begin(), vec2.end(), []() {
3 ?% `0 r1 o! a; A& }2 ^: ` return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
+ @) o7 _' [# | o });0 V" a* P) ~* o
B" Q( [; U( u& m7 A for (size_t jj = 0; jj < vec1.size(); jj++)% X/ E9 [& N6 N( ]; G1 w( r6 D
{
! k! m4 G5 u$ k2 g$ ` b1[jj] = vec1[jj];1 V A1 x) k9 c1 K0 O! O
}
2 D1 v+ v9 I1 {6 H
, B3 _: F# r4 ], A6 w for (size_t jj = 0; jj < vec2.size(); jj++)1 {/ ?6 l: ~# O% d7 W5 @4 u# u4 ?
{
% D- r, @: B. B b2[jj] = vec2[jj];# O/ p" Y3 E+ U) j: Z
}3 v5 Q3 P' D7 W7 ?. E7 F
; r' L4 h% D3 l9 F! { //Method - 1 N=100000 247s , l: p$ p6 Z" Z p9 q {
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% U% }& a# ^0 \: l& d' u2 }
- t( g6 B' l: J/ J$ l$ F0 Z //Method - 2 N=100000 237s) w9 c9 S9 G8 S: q5 S" o
/*
) w+ o6 n, ~9 \( z. K2 B for (int jj = 0; jj < N ; jj++)2 J* ^, p" `( R/ b6 u! S
{ M$ s2 ~9 `& B) [) ]# s# r
fresult += vec1[jj] * vec2[jj];; S5 u! A9 c) k @# d5 g" B
}
/ c# \; w2 w+ |8 }$ v */
G {& r" {& L6 ?
' [) J+ M8 H( X7 \. z, R! m" X //Method - 3 N=100000 204s
/ D" C! X& G! g7 B' d) d8 ?8 ] /*
1 ?, ?2 n* e; F# z' E for (int jj = 0; jj < N; jj++)
5 B' Y; O7 ^& A0 V8 b, S( {0 W, k {
: ?' e3 x; E$ v2 d! Y( h, k. a fresult += b1[jj] * b2[jj];" o' U5 L1 B5 C; h& E, s+ i
}* M: w5 Z& T) U) M
*/% |/ [4 @2 ^3 m
[( ~9 o3 ? A/ v1 ?. O2 C
//Method - 4 202s
( K( p$ ^# _; U# X4 f. N /*1 v( S# `4 s6 q9 t) |* x- X
for (int jj = 0; jj < N; jj++)
1 z7 F# |! {0 W8 C$ ~, L+ H {
) L/ Z* v3 |" d( F. ]6 z- Y2 p9 {0 } 2 t/ _# A `( s" B
}6 h) H- g, E5 o: ^
*/
8 t& h! e9 u% C" J0 R1 _& D2 ]+ I //comment out all methods, N=100000 202s
) D0 d9 Y/ X5 G' E6 l }+ c( C) E8 H/ Q5 C+ U
. T" f0 n' d! i7 }- ~+ P& E4 E, F' J
delete []b1;: r2 n, v H8 d) ?! v1 k* D
delete []b2; 5 Y1 A; ?) t* T0 j
|
|