转换循环以进行并行化

我可以使用此代码进行其他哪些循环转换以增加潜在的并行度?

代码在这里:

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] = B[10] * 14.3 /A[10]
C[10] = C[10-1] + C[10-2];
for(int i = 11 ; i<N; i++)
{
    A[i] = B[i] * 14.3 / A[10];
    C[i] = C[i-1] + C[i-2];
 }

这解决了第一行,但是无论如何我可以在循环内转换第二行吗?

zhang_ding345 回答:转换循环以进行并行化

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

大家都在问