TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
% P/ s8 ]1 j( c5 f" q0 x# B, n! `1 k" K: f- D
理了理思路,重新做了一个测试。
1 [/ Q. `7 w( b做了两个 vector 和 两个 float *, 都长 100000' v% a8 e& R, k& D) s9 {: H
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
% Q7 M: L# h1 ]" T; f8 T# A
1 i: U3 H. _" ^( R" v- Z内循环试了4种方法,( P! c/ p. H, Z+ [. r p. f5 R& C
1. 直接调用 vector inner_product 247s
" v6 r @9 w* ~& F# {$ p2 ~9 w2. vector 循环点乘累加 237s% W! z7 W9 L" z1 S; `" u# G9 U
3. float * 循环点乘累加 204s3 O) a0 u3 |% S3 B# B" P
4. 空循环 100000 次 202s
- S; T$ _- J! T: p. K! P% D$ V" W# d2 f. J; |5 I
不做内循环 200s: ^" F! T' i' @
1 s' h3 Y( j& m3 L$ ?; H
你昨天说的对,内循环本身占比是很小的,大头在其他处理。" f* i) E+ p- T- w; D2 v
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
4 O2 X- A$ F5 D% ~3 w% A# k
/ }% A. ^$ N; K1 h V0 _3 r) m" X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)2 \6 l8 i: N$ l0 ?3 Q
9 p4 F$ @7 J |" |" ?
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
" [' O1 y; o' ?% u* ?+ v8 _0 ]% a0 m8 }/ ]; A& q
std::vector < float > vec1(N);
6 K9 O) ~4 v) c std::vector < float > vec2(N);* M0 U0 }' M* b7 X6 z
float* b1 = new float[N]; z% A1 h' H2 ^0 O
float* b2 = new float[N];
( Z) [5 |& d6 _& W1 i3 u) ^# Q( D: s- c# Z4 X* K: a
for (int j = 0; j < 6000; j++)$ }6 ], Y" O8 k- V
{
: ^. N+ ?. F6 A |8 c- e* r, G W; C std::generate(vec1.begin(), vec1.end(), []() {
& W: r/ R5 ?8 c9 Q1 T$ k6 Z5 G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' Y! _1 m5 U# q- d/ F });, E' K# R4 c" P4 b+ u" M# b, k. U6 j* O: Z
+ [8 m8 r/ e; a2 h3 ` std::generate(vec2.begin(), vec2.end(), []() {3 D" t6 C( i! S* s
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 R3 n) F( m9 }. T
});- @( ? a6 o& C! E# T
7 S- e* @ Q1 I* ?; \0 u7 W2 Y
for (size_t jj = 0; jj < vec1.size(); jj++)
; o2 I, k8 K. j' @2 N* |) m {
/ `/ J6 ]# n* z7 u; _' M0 _6 c0 L b1[jj] = vec1[jj];
" Q8 `, O# x+ U9 V8 u }& \- V% G+ {5 Q- a1 t4 Z) ?
) t- x! I* u) h- a, j; \
for (size_t jj = 0; jj < vec2.size(); jj++)4 f0 J+ @! Y [4 j) w" y5 H& p: X6 n
{9 Z/ C1 V. \, M+ z9 a' [
b2[jj] = vec2[jj];
: O; O% v; L- ?7 V }
# b2 L' [) K6 J* r5 F: d8 R$ R( j4 l) E3 N% d( Z+ ^, R! t
//Method - 1 N=100000 247s
6 @! h' M0 l" h7 z //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 Q, \- I) J* b; }) x; A6 \* I
/ ^1 ~/ C6 z, S* L! V //Method - 2 N=100000 237s
( Q$ x* Q" X( `! I% f7 A /*' Z$ l& ~8 k( o7 Y
for (int jj = 0; jj < N ; jj++)4 B( v" ?0 t0 R7 i8 e" q! Y/ S# ~0 I
{
0 B0 M( u# h* {) `: n, ^2 {5 \( G8 Q fresult += vec1[jj] * vec2[jj];& q4 h. O7 }% o+ I1 a7 R, P- q
}2 b( L) O( `5 r
*/
; S% o" y6 {8 V a: o
! m9 q) R! \3 M' ] //Method - 3 N=100000 204s) j. S- W, E$ b; y* Q, | u
/*2 O0 w+ h! B$ g
for (int jj = 0; jj < N; jj++)* m2 Q5 b+ u2 I) A6 L w
{/ G; }8 Z4 F9 N" v3 D& K; f' H
fresult += b1[jj] * b2[jj];
* E5 v N1 l- r5 [' U% o4 l! x2 v! s }% O2 F9 c/ n5 P8 u, N- M% a
*/+ K. k; s0 N5 b) V& `) L* D0 C
& e6 w* j! R7 Q" [8 B/ g
//Method - 4 202s
; i0 \. i( n- c. _ /*0 [2 c% Q5 B4 i% {, V* X8 [# s# @, t+ W. |
for (int jj = 0; jj < N; jj++)2 T5 v+ T% U3 |. O7 k
{
% @' ^6 w! z( I1 i6 Q 5 d+ e9 r2 W5 l: |' \. @# k6 S
}# D1 w2 v& G6 q }8 F
*/& t! h8 |% E O" o+ H6 W. U
//comment out all methods, N=100000 202s
. x5 y. H# T% K$ |, b) ^+ J }
7 l+ d! s# z Z+ ]
3 f8 x7 q# `! E/ A6 b( s8 t. s3 y delete []b1;+ H, y" U \5 Q
delete []b2; # @. }7 u/ W$ b& g4 f+ U# n
|
|