TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / x# ~7 m0 c. d3 g+ \6 B3 n B* |
3 @$ ^1 z7 u. y: F7 |7 v& d理了理思路,重新做了一个测试。/ U( k7 U! ~5 B' |7 t4 s
做了两个 vector 和 两个 float *, 都长 100000' c' A: H2 u8 K5 }% m
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ e9 Z/ s& ~! }( g6 n' M
. A4 F @" J" g$ h
内循环试了4种方法,
a: @6 R$ @" {7 P; a. _1. 直接调用 vector inner_product 247s - Y/ _( U! K) [3 n) l* s: S/ s- ~$ x
2. vector 循环点乘累加 237s
& `) e' q( z0 y) d: @6 a% t5 E' H3. float * 循环点乘累加 204s
( A1 Q5 z% y2 H+ T" c) _: b4. 空循环 100000 次 202s
7 w5 c! |3 `) b8 e9 O; {
- x$ Z. L3 w4 d* y3 X4 c. Z* ~不做内循环 200s2 ^# B+ f: X; e' `0 O6 f
1 e' B8 n- J, ?$ E你昨天说的对,内循环本身占比是很小的,大头在其他处理。
* c0 o: y$ x# P另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 H( L( Z4 E1 F8 f' \5 G
8 e" i/ j$ c: K; F! e- W: B! C l/ y至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 m: r7 u3 V0 t+ p) \
0 K q t+ R8 d) X, \/ K
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)( q+ m- X7 |6 n' z& r2 ]* P
4 h4 O" ]' g" r std::vector < float > vec1(N);
5 [2 S! I- _, c) }7 L+ _# \ std::vector < float > vec2(N);
7 Q3 @ J2 `, x+ L; o float* b1 = new float[N];
9 u' L3 V5 k4 m3 H" l float* b2 = new float[N];! l. t4 I# n+ u& ]
P; P2 c! } S: ~
for (int j = 0; j < 6000; j++)
7 Z- l4 Q+ X" J% D* _ {
. K0 n0 I" y7 j* _$ l6 K std::generate(vec1.begin(), vec1.end(), []() {
, R( D; e t5 l" o return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
R! |5 t0 B0 z/ V });
+ ]- ~ y) c( }
?6 E7 E/ g, X std::generate(vec2.begin(), vec2.end(), []() {
+ i9 [/ i. b# j; C2 M7 _ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) N8 r, Z& _ v) s7 Y( K m7 x4 a6 o
});8 E$ d& ~5 I/ g Z
8 T% d! [& ^ R7 f' l4 q for (size_t jj = 0; jj < vec1.size(); jj++)
0 D, [2 F# _& z- G: O* X" g( j2 D8 d {! m+ B o3 Y( B: g" D0 }7 T6 v
b1[jj] = vec1[jj];
2 ]) L# h# c9 S) V) ^" i+ X }( K# n- s. J# `" P
U2 @! p" m, X8 W: |2 S for (size_t jj = 0; jj < vec2.size(); jj++)
( _: W( Q1 I: K2 r7 Z {
/ r* @& X4 v8 T' B5 ` b2[jj] = vec2[jj];
; O3 Y/ ?. W) `8 W; `9 W }
1 Y# ^4 J+ R6 W# ~5 S6 S" M0 [
% U, ] @! P( h. z //Method - 1 N=100000 247s
8 f5 Z O0 [7 Z# c //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
9 B; c( L9 q0 o9 u9 l7 @
0 N3 P# t. t1 s0 V* j9 f7 ~ //Method - 2 N=100000 237s
`7 \) S# F$ U' l; u: l. `2 [ /*) {9 n( R/ y" o! P4 g: @
for (int jj = 0; jj < N ; jj++)! Z# Q8 a5 T$ j$ x
{
; ]* o, {* J* R5 d fresult += vec1[jj] * vec2[jj];
9 u: ?+ f# M8 q. d3 I }
: j+ d8 W9 X# o */. c# Q3 m, N6 [
/ t- Q; x2 k' x$ o //Method - 3 N=100000 204s+ s, r- J; Q0 G7 H3 v8 \& P/ H
/*3 d, Y' V P! D+ h
for (int jj = 0; jj < N; jj++)9 J! x- K: W) X j$ |" [
{* U4 z+ }6 f: Q
fresult += b1[jj] * b2[jj];
' f5 h. w* l& ^4 `1 k/ b; Z }( w U) {: r, p& H
*/
' z1 M0 H |% G2 `4 _
% [7 \6 t/ S' l O! U //Method - 4 202s
6 X, |1 }( [3 _- m7 j v1 L, c /*% n. Z4 k. A/ l( H" I0 [$ s) D
for (int jj = 0; jj < N; jj++)
# C. K% B, w3 U( @' i* { {& h- [+ R" Y! c T& K2 s0 d: y) n
4 N4 I. l5 L, M; \# I/ T8 Y }
2 Q5 x, H) `0 f */9 p% h; w* P" v8 v9 B" C3 w6 f$ k
//comment out all methods, N=100000 202s 7 C% ?( b: W" o) ?9 z: p+ M B- \
}
2 G. B5 F l* B& ~8 c, V( [2 x3 X/ w* e
delete []b1;
2 z4 S) H: _0 x delete []b2; 0 e# o# i4 ~8 f5 J
|
|