首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenACC:'*(*(b))‘的复杂循环携带依赖项阻止并行化

OpenACC:'*(*(b))‘的复杂循环携带依赖项阻止并行化
EN

Stack Overflow用户
提问于 2012-10-16 17:33:26
回答 1查看 2.9K关注 0票数 1

我使用的是带有动态数组分配的OpenACC。下面是我如何分配:

代码语言:javascript
复制
float **a;
float **b;
float **c;
float **seq;
a=(float**)malloc(SIZE*sizeof(float*));
b=(float**)malloc(SIZE*sizeof(float*));
c=(float**)malloc(SIZE*sizeof(float*));
seq=(float**)malloc(SIZE*sizeof(float*));
for(i=0; i<SIZE; i++){
        a[i]=(float*)malloc(SIZE*sizeof(float));
        b[i]=(float*)malloc(SIZE*sizeof(float));
        c[i]=(float*)malloc(SIZE*sizeof(float));
        seq[i]=(float*)malloc(SIZE*sizeof(float));
}

下面是我是如何并行矩阵add的:

代码语言:javascript
复制
#pragma acc kernels copyin(a[0:SIZE][0:SIZE],b[0:SIZE][0:SIZE]) copy(c[0:SIZE][0:SIZE])
        for (i = 0; i < SIZE; ++i) {
                for (j = 0; j < SIZE; ++j) {
                        c[i][j] = a[i][j] + b[i][j];
                }
        }

当我用pgcc编译这段代码时,它会在循环迭代中检测对float**指针的依赖,并生成所有标量内核(1个块,1个线程/块),这与预期的性能很差:

代码语言:javascript
复制
 40, Complex loop carried dependence of '*(*(b))' prevents parallelization
     Complex loop carried dependence of '*(*(a))' prevents parallelization
     Complex loop carried dependence of '*(*(c))' prevents parallelization
     Accelerator scalar kernel generated
     CC 1.0 : 11 registers; 40 shared, 4 constant, 0 local memory bytes
     CC 2.0 : 22 registers; 0 shared, 56 constant, 0 local memory bytes

循环显然是并行的,我认为编译器也可以检测到这一点。我很好奇如何向pgcc解释?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-16 18:53:17

我想我找到答案了。关键是使用independent子句:

代码语言:javascript
复制
    #pragma acc data copyin(a[0:SIZE][0:SIZE],b[0:SIZE][0:SIZE]) copy(c[0:SIZE][0:SIZE])
    {
             # pragma acc region 
             {
                    #pragma acc loop independent vector(16)
                    for (i = 0; i < SIZE; ++i) {
                            #pragma acc loop independent vector(16)
                            for (j = 0; j < SIZE; ++j) {
                                   c[i][j] = a[i][j] + b[i][j];
                            }
                    }
             }
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12911619

复制
相关文章

相似问题

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