TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 q, U2 ^$ a# o
7 N8 Z8 f# B6 w8 j理了理思路,重新做了一个测试。
2 s+ f9 w2 B" d( v V做了两个 vector 和 两个 float *, 都长 100000
; ~3 h$ ^, @' T外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.) Y- H& J% H+ N# F/ b
$ l9 h% l6 K( i+ Q
内循环试了4种方法,5 q: \2 @" D7 H% N: F) c) E
1. 直接调用 vector inner_product 247s
& n2 u0 c& I5 I, I w/ ~% v$ ~2. vector 循环点乘累加 237s
2 e2 L- A7 }7 F8 J! u4 `2 Z$ {3. float * 循环点乘累加 204s
1 {# X! n! `: [# j' J4 ^4. 空循环 100000 次 202s
' c! J+ e- Q$ R3 w- I1 B% |
9 z8 e2 J0 c# b& o! e不做内循环 200s8 {1 M' A$ j1 |# K
: ^: n4 \, x4 X你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ B: E8 D/ ]! Z" p, z) ]% R
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* P, N, b% X7 _
5 T* e9 A5 R: z- D, I6 ?2 x. b* v
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 ~: B" v/ U2 z- s
( E% o. v! m% L+ u(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- U; x; O' ^% v+ v1 K; I' s. m
0 q) W( g% u2 }. s4 V1 I ]6 J
std::vector < float > vec1(N);% B: ]' k) P+ n: l: s6 S
std::vector < float > vec2(N);
; g4 _( b! `8 \, p; x1 o, E float* b1 = new float[N];
! A( E- v$ B* s$ k: z float* b2 = new float[N];
0 ?* d5 V; t5 t( v2 H4 d* z3 c. ?6 B. Y* o: j
for (int j = 0; j < 6000; j++)
5 O6 v4 a! b% @: O2 V {
9 j9 ?3 b# s& B9 {/ M) u. J std::generate(vec1.begin(), vec1.end(), []() {
3 f' S1 Y$ A# k return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;9 q" W& D9 G8 t
});6 z) Q7 ^& a$ x( ?, ?7 L. c: I1 q
$ p! A3 q1 M( j( P/ w$ q
std::generate(vec2.begin(), vec2.end(), []() {
/ K- I! n% K: L return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! d: ^% V7 G: _7 @2 ? });/ j! I+ I4 o! F) g/ Q2 s
, p: ~. S& C1 s' X
for (size_t jj = 0; jj < vec1.size(); jj++)
$ q$ X; b. _4 E {
7 W: N$ _. W& R b1[jj] = vec1[jj];2 D" T8 R& Z" I2 y
}. i6 M0 _- ?) R, x% y! c) v
4 l- ?" }! ^& W0 ]$ S4 y! i
for (size_t jj = 0; jj < vec2.size(); jj++)
Q9 e! y0 a2 ~ {# a0 N' e r6 H5 t1 C" x
b2[jj] = vec2[jj];. q8 `* Q* r, g4 M- p2 I- P
}( ]; {' K& Y2 l; m: Y3 B
; {9 |! g+ F# z; ?0 ]/ k+ _. l
//Method - 1 N=100000 247s 0 t0 `3 Z9 F: u5 M- t
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, X. N$ ^$ W3 f2 E: t
1 p' G# x c0 W: y0 x: F% x* J
//Method - 2 N=100000 237s" e: b) `( V3 C# W; W, `8 ~, r5 g
/*
5 }7 R0 n. _' z. A+ b' X' a! u7 T for (int jj = 0; jj < N ; jj++)) `, k8 F+ y. Y& Q1 K$ f
{, V" D; {' m6 S$ |+ y; ?
fresult += vec1[jj] * vec2[jj];: q9 S( ~( b3 |+ i7 D8 w+ W' s
}5 z5 e9 o# F; y0 j) E! k
*/7 _4 f/ V& c f( Q8 h5 W
) {2 ~# U# N( U
//Method - 3 N=100000 204s0 L6 q2 ]! ~6 S4 O$ m
/*
7 T4 u) ^) ]- B! y for (int jj = 0; jj < N; jj++)8 q, F+ G4 K1 A
{
0 N# U Y: l# F0 S fresult += b1[jj] * b2[jj];
, e0 t$ x9 n9 R' l2 B" q4 n) N' Q }& w" o1 B( C3 [0 A$ H7 B
*/' {2 I; K5 r1 A% X8 `; k% X# d' n/ u
6 l3 F3 v' @, w4 R% g8 S. { //Method - 4 202s) w' B: L1 t& I+ D1 ` z
/*# W ?) D7 t; b" v* k% Z
for (int jj = 0; jj < N; jj++)" S- |+ ^; B: |+ k) c2 e' l- f
{# Q+ O0 @7 U. l4 p5 Q
6 K2 L7 z& C1 t6 N% J* H( ?' ^2 I
}
4 R' e+ A7 m: H1 k; m$ a( A */
' a) B5 C Q, \% d- S //comment out all methods, N=100000 202s }) q, E& \: D ~: a& E
}: k1 W9 k' [7 p) r4 N
! w( ]7 E' y8 F4 R, x5 c2 O0 \
delete []b1;
) J" T! _6 m5 B) o/ L7 q4 i0 r& ? delete []b2;
% T% P3 C0 s9 V |
|