TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! n$ u1 T; E) v0 J, p) f
$ X a6 @. _8 X% Q
理了理思路,重新做了一个测试。
9 C, ~3 Y2 |6 ^2 O做了两个 vector 和 两个 float *, 都长 100000/ e1 z2 K; i+ m, A4 S
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
3 j: c$ W6 R$ {, c& g! p8 F) |- ^1 S' y
内循环试了4种方法,
% R3 T, X6 _% z8 R1. 直接调用 vector inner_product 247s
% Z5 C% i: G$ ^) z8 N( g2. vector 循环点乘累加 237s
; N. L$ J- k+ d) N# c: u3. float * 循环点乘累加 204s7 A8 e$ B9 v {/ G+ A6 p6 b
4. 空循环 100000 次 202s
/ M1 \0 h' f& Y1 E3 K. @2 _) r* v# e5 q. n
不做内循环 200s
! G9 l: h9 U. @: f
; c3 D9 V* N1 x9 Y你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 Q: }: c: R9 A0 @另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
8 N, }9 `2 ?" y9 y4 ~- ]& U* {; p; a) ^$ \' Y+ R0 V& ?: L3 |# [
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% l7 ^0 J; d/ s% y& K) T% Y8 G f0 l5 p
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* e0 \. } M$ B9 i6 p5 c+ @, S1 `0 g8 u% q: v& D
std::vector < float > vec1(N);5 L" b# z6 }$ w8 U/ x. u
std::vector < float > vec2(N);
4 b" ?8 [' P5 g8 E+ [ float* b1 = new float[N];$ N. u" v% ^! U5 ?$ I
float* b2 = new float[N];
$ ^' o& w2 G! x) {
6 ]/ {1 F% m8 H8 b$ b4 _+ F5 }( Z for (int j = 0; j < 6000; j++)
; O; d# Z9 M) K% V+ I5 b {
* o6 k; H5 a- f" d std::generate(vec1.begin(), vec1.end(), []() {
' m& e# b& K; {. F$ T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;# M* S5 F2 U, ]7 _' \
});% O( A4 C" B2 _; A) j+ i! ?
* y5 ^/ a6 h' u) H5 V std::generate(vec2.begin(), vec2.end(), []() {5 ^! i6 N/ H! S5 Y& q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& s+ V! X5 \2 ?$ I });
1 i" }9 U6 C8 w+ C! ?( O; ?- W$ c
. O( I6 t8 ?; ]- M/ t for (size_t jj = 0; jj < vec1.size(); jj++)- }& J5 O3 W3 D: r6 X" p
{/ f8 A# d" A! p: t2 H
b1[jj] = vec1[jj];# i( R" @1 S* }2 s* A
}
4 f( k# _1 B; ?( o1 p V7 e8 C: C, w# y. z$ Q/ g
for (size_t jj = 0; jj < vec2.size(); jj++), E _4 {9 t8 j. [& s3 r
{8 a* W4 q- X2 a
b2[jj] = vec2[jj];9 N% a4 q$ H# F- p$ v9 B
}
, [5 G- B2 b) y9 M2 `- @, b* l
//Method - 1 N=100000 247s
6 _' v5 @' n% }2 X' F2 Z0 P //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' m* L) _1 S% T( x6 ~4 f# s
+ L3 k& X7 c& A3 e; z% X //Method - 2 N=100000 237s% D+ @0 B& \) \3 n7 A
/*
/ k- z" U: X1 d for (int jj = 0; jj < N ; jj++)
+ B2 z0 k! a0 G N& s2 `* N {8 l4 [) a0 _% g
fresult += vec1[jj] * vec2[jj];
+ j! ]4 p$ h$ z1 J0 o! J }! V: A* t1 @9 Z! t6 d0 O* G0 f
*/& v& n( ~3 r3 s* A( S
9 H; w- I4 b# d: X. f //Method - 3 N=100000 204s
3 ` H. n+ o1 ]4 j, r$ O /*6 c3 h9 e8 s0 k# v6 g
for (int jj = 0; jj < N; jj++)/ u! G) `& o8 V1 N
{
) `7 S7 \3 t, Q1 I) m% B5 | fresult += b1[jj] * b2[jj];( r* T0 I0 H* V. F- P; ]" M
}
0 B3 I1 K% l6 {3 W' l9 A# J */
% h, p5 Q: w/ |: y+ m! V
" K2 X2 `0 z- ?( z5 L, T //Method - 4 202s
2 k6 X( O1 `/ ^" ^( E" V' o8 F /*
8 y& l1 |$ d4 _- g# e for (int jj = 0; jj < N; jj++)* k) D8 U1 O" T l8 W& l
{* ]9 d2 C5 l8 ^
5 Q- t- R" O2 F) E
}: H# N1 O& ^( I
*/
! d* d. V- e2 O/ _! q% y2 M9 P //comment out all methods, N=100000 202s
6 e. ]( n! I/ s1 p } _) {9 Q9 M% c6 f# z4 x& |% [2 ?
8 C- h" I: g, b delete []b1;- B2 S; W# K. C( h9 a. p2 z7 \
delete []b2;
4 v; y H; I' R3 D |
|