TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 Y( [3 N2 e' `4 j
9 i/ @7 i9 b2 u7 N7 R理了理思路,重新做了一个测试。% A: |, ~8 B3 f
做了两个 vector 和 两个 float *, 都长 100000
+ b, ?1 R" p' N外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" I/ k& g9 V# z# C. K2 s! c9 D+ D1 y' [! I5 o8 s
内循环试了4种方法,
2 |8 D$ Y* e2 m" d" B, U1. 直接调用 vector inner_product 247s . h0 M' H! u5 Z1 @* @/ @# O# ^ L
2. vector 循环点乘累加 237s2 N! p, N2 ?, v! @7 u
3. float * 循环点乘累加 204s8 e( V# g6 n+ y# u* B/ v$ _
4. 空循环 100000 次 202s
$ E/ y2 S* E6 w5 n, W9 V, Y0 P6 |1 T" M
不做内循环 200s
$ x5 q3 G2 j9 E3 B4 R5 }; w& |$ a! _6 w# Q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
) n7 x" o- ]8 `9 }% q$ V- U2 T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 ~' ]: _) R7 K7 }* J
, ]& q) _3 I0 n* a& n7 \/ o
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
) ~7 K% p/ N4 c' D& S
' D0 C/ I5 S) y) P(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 z6 A V/ Q# n$ M3 q+ S
- j ]: a' X- a! a9 d1 l
std::vector < float > vec1(N);! f0 x0 a& o9 V1 w; x4 n
std::vector < float > vec2(N);
+ Z+ v, T$ ~% x5 Y# F' m: p float* b1 = new float[N];
4 p* C5 e5 f7 c; i0 }) f& L! ~ l float* b2 = new float[N];
* z7 I' [0 p& m0 l7 v! T# F" u. b# ?3 {& Z0 f/ d+ U
for (int j = 0; j < 6000; j++)
, L+ r$ D2 N9 }8 E6 W7 n+ } {
7 M. Y: k' D& c+ G4 P std::generate(vec1.begin(), vec1.end(), []() {! l$ ]- I: t' f a
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;( O: A6 U7 C% w# {. L
});
- V% T1 _8 ?! T- H o/ z, w8 B' L' T5 l; b
std::generate(vec2.begin(), vec2.end(), []() {& K- @( G% m, a7 p0 F8 B9 [
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 a% O: C4 c8 J% A! j" X
});1 q3 e& ]* `2 P7 t
; e7 H8 r/ c! o, m" S" D' M# u Z for (size_t jj = 0; jj < vec1.size(); jj++)# A6 V0 F- h4 b) S: x
{# e3 G, h9 H( n8 M6 E
b1[jj] = vec1[jj];
* ~+ U U- O9 D, X5 D }' d- h* s' H7 V/ L# h1 w5 t; ~/ h. U
3 R; g: E9 w/ C. p
for (size_t jj = 0; jj < vec2.size(); jj++)
8 A& x! W; H# t w4 D/ S% J7 Y {9 P/ `; M% ?+ |/ a
b2[jj] = vec2[jj];# |2 ~5 H; t5 G6 m7 @" ]; P
}
$ M& q1 n8 h$ e- T3 s; S1 W0 J) ?7 V
//Method - 1 N=100000 247s , W9 P% O8 @ H
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 X3 x. ?. m* o( }% y
6 n( Y$ M6 \& F5 D3 E1 G. w //Method - 2 N=100000 237s+ c7 v. v2 q) ?, c+ r$ G4 G
/*
/ L+ _$ M9 v' `; r9 K for (int jj = 0; jj < N ; jj++)
, Z) `5 `% y% [+ Q, z& A: V {
# S z1 |0 u% W fresult += vec1[jj] * vec2[jj];; N) O. l7 N% I, w: U0 \) ]
}: u4 W. u+ T" L/ w
*/
% q/ p$ G( \ c. K2 ]! j, A# U ( |2 O$ @7 D; }. \! F# h5 w
//Method - 3 N=100000 204s
$ F9 x4 R/ j" O; V9 L$ T; z% H& ` /*% S9 Z' a$ |9 z. X# T% H% s% o
for (int jj = 0; jj < N; jj++)+ T! d0 d% M3 Z8 L% [
{" B9 ^$ [6 {7 b3 l
fresult += b1[jj] * b2[jj];- d* R L1 b3 h( _2 R
}) n6 p( o$ }% o" \: f; c
*/
" _ w3 ?+ v. w4 F: v& y; Z: M8 R/ M! _ ~2 e
//Method - 4 202s4 R! Y8 A U m4 P v6 x5 c& x
/*
' k0 ?, R- M0 p- B3 }6 d6 M/ X for (int jj = 0; jj < N; jj++)
0 M+ q- i; S0 C {9 X" [4 J* G9 O
- P% ~% S p5 P0 g }: s' k" {+ l7 N6 A- ^
*/
, X5 ]8 p' X( y) X3 L //comment out all methods, N=100000 202s
! S) [, n9 f% k" Z }: B7 j5 |3 c2 k/ y6 W. D2 K
; O$ \* J4 M4 G& U0 }+ c7 G
delete []b1;$ P1 h! q% q5 }4 n
delete []b2;
( t7 C$ C/ X5 i, Q |
|