首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将循环转换为并行化

将循环转换为并行化
EN

Stack Overflow用户
提问于 2019-11-04 12:06:37
回答 1查看 26关注 0票数 0

对于这段代码,我还可以做哪些循环转换来增加潜在的并行性?

代码如下:

代码语言:javascript
复制
for (int i=10; i<N; i++)
{
    A[i] = B[i] * 14.3 / A[10];
    C[i] = C[i-1] + C[i-2];
}

到目前为止,我所做的是使用循环剥离:

代码语言:javascript
复制
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];
 }

这就解决了第一行问题,但是有没有办法在循环中转换第二行呢?

EN

回答 1

Stack Overflow用户

发布于 2019-11-04 16:49:36

代码语言:javascript
复制
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和使用浮点或定点(所以你可以使用预先计算的常量,而不会造成很大的精度损失),所以你可以分成:

代码语言:javascript
复制
// 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的知识和结果的准确性,否则不能拆分它。

结果是:

代码语言:javascript
复制
// 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];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58687074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档