for (int i=10; i<N; i++)
{
A[i] = B[i] * 14.3 / A[10];
C[i] = C[i-1] + C[i-2];
}
因此A[10]
是一种特殊情况,因为您已经发现,C
并不依赖于A,B
并使用浮点数或定点数(因此,您可以使用预先计算的常量而不会带来很大的准确性)损失),因此您可以分为:
// serial
A[10] = B[10] * 14.3 / A[10];
c0 = 14.3 / A[10];
// thread 1
for (int i=11; i<N; i++) A[i] = B[i] * c0;
// thread 2
for (int i=10; i<N; i++) C[i] = C[i-1] + C[i-2];
现在B
独立于A
,因此您可以在任意数量的线程上并行执行第一个循环(最多N-11个)...
第二个循环取决于先前的结果,因此除非对C有更多了解并且知道结果的准确性,否则您无法拆分它。
导致:
// serial
A[10] = B[10] * 14.3 / A[10];
c0 = 14.3 / A[10];
for (i0=11,i1=11+(N-11)/M,j=1;j<=M;j++,i0=i1,i1=11+j*(N-11)/M)
// threads 1...M
for (int i=i0; i<i1; i++) A[i] = B[i] * c0;
// thread M+1
for (int i=10; i<N; i++) C[i] = C[i-1] + C[i-2];
本文链接:https://www.f2er.com/3169161.html