TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 C% e$ `* V. z- G3 L2 I, @
: e& P7 m, c& q2 I- \" T1 o7 M理了理思路,重新做了一个测试。
* n- G6 V/ a [& G+ }" a做了两个 vector 和 两个 float *, 都长 100000
" v, x0 ], }6 l, B' \: L# G外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 x* I+ y5 C. `/ c+ D6 a. w& N
! \( i6 [! @, ~; j: Y
内循环试了4种方法,& S. b8 C# T8 ?+ W1 E0 S
1. 直接调用 vector inner_product 247s . l" L/ h8 Y# ~( [
2. vector 循环点乘累加 237s2 {5 l0 _8 }' K- O% s
3. float * 循环点乘累加 204s
6 `$ b' i! f4 j! O6 A+ L! g4. 空循环 100000 次 202s
, |0 k1 C4 t+ H5 |2 n1 @1 {3 _5 o! s1 [8 x0 T( {. a
不做内循环 200s
1 Z7 `: R2 G$ D8 w4 e7 X6 u9 ]2 w' b. }7 v
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, `2 S1 j: j0 E+ k# ~$ C3 k( R! t: c9 m
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. }$ q: y' N% y5 x
# @7 P7 T' e' D. Y6 r至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 ^: [$ x( M( P3 i# G5 p
8 u: H* Y0 r. i; L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)* ?, R- q' N6 o, P' h+ c- @
5 D. _6 \' V( K3 d
std::vector < float > vec1(N);. T2 L- ]; _: ~, j, e" Z# y0 p
std::vector < float > vec2(N);
; ^! W, U5 z# m4 j7 x# O3 f float* b1 = new float[N];) c7 ?! g$ T, c
float* b2 = new float[N];
6 h+ j& m- ~, R* }1 ]( u$ r- @, n4 u9 z$ Z
for (int j = 0; j < 6000; j++)2 _* ]/ X" v9 K" E) S
{
' E. f- T& R- B+ i. |* J( N9 y( z std::generate(vec1.begin(), vec1.end(), []() {# ~* B2 x# R# a) @& h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 X$ A! P5 k4 B
});6 {& W# }- H7 D _) X3 E
& F7 T2 I5 s$ e, i: ^ std::generate(vec2.begin(), vec2.end(), []() {3 X3 l0 z& D8 q# M1 A( E& ~2 a
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
% [( N* @2 ~, W# `: d' S2 E });0 G ]* C) ~5 L* q" e: x
7 b' M+ T/ i# K6 j5 }4 d2 K
for (size_t jj = 0; jj < vec1.size(); jj++)
) b+ E% m/ ^9 {" i7 { {: f, J1 D' H* C$ i) f
b1[jj] = vec1[jj];
( g- Q, R) i4 z$ g) Y }
5 E: x4 g! r# B! {: O* }+ w$ e+ q
for (size_t jj = 0; jj < vec2.size(); jj++)
0 o% g; L" b2 L4 I& z {
6 ?+ X C, Q f" @; I b2[jj] = vec2[jj]; c9 O* Y$ y1 V1 {5 a& X" u9 A
}) u3 B# v0 ?: L' a% `5 g% g
" ^% \" c- N8 V- k( \ //Method - 1 N=100000 247s
; i% T+ E: l# @1 D# F //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, @( N P7 H$ o
. t# V! _+ E6 |! `' |% [" M //Method - 2 N=100000 237s
, ?5 T- U/ K d9 Z! D /*4 k# i* `5 W" G
for (int jj = 0; jj < N ; jj++)
! B* K# n! |" b8 |$ l {0 L/ s8 R T( u5 c( t
fresult += vec1[jj] * vec2[jj];3 g7 A1 b5 ?; H& S+ b* }+ Y7 V
}& o; f6 G3 s3 p' [
*/9 J8 r$ c! Z( w9 s9 q
6 n, X) ^' i; h9 L' q2 x
//Method - 3 N=100000 204s7 C. ]; w7 J# @" V
/*& i5 k+ B' A3 I& {& Y4 j8 W2 Y; P- f; J+ I
for (int jj = 0; jj < N; jj++)
0 r2 K3 H2 q$ l* y {
! ?8 K% c. S0 l6 J# `3 I) [# S) y fresult += b1[jj] * b2[jj];
$ H3 \* T+ S, l6 O }2 u1 C) D) }. }; n
*/7 _1 P5 L9 J5 F L8 q
4 ]/ ^2 |' [' b' a9 n( |( d
//Method - 4 202s
5 h# h$ [, _" b5 h0 X* Z& M /*% p6 B2 I- G7 F# o( `6 R
for (int jj = 0; jj < N; jj++)
) e( [3 E! b+ F a {
0 O# k q( @8 `, _% I# b ; o. r/ U. d* T; x% L9 h% G
}
% i# _# E3 |! P, K. `% a% m */0 r1 i. _6 s4 M' j$ Y: Q |
//comment out all methods, N=100000 202s # l# g: t4 h& t9 u
}6 o; N6 k+ e; U8 ^3 s+ t) I) i3 ?+ S
3 A& M8 l9 ]6 A6 H O delete []b1;
+ H2 ^' r! S& e8 c" q4 Y: P: l delete []b2; 5 }3 |% p+ F; }7 O
|
|