【问题标题】:OpenACC Loop not vectorized/parallelized: contains callOpenACC 循环未矢量化/并行化:包含调用
【发布时间】:2020-10-02 05:56:05
【问题描述】:

我正在尝试并行化一个使用 OpenACC 构建 Voronoi 图的程序。我目前正在努力使嵌套的 for 循环并行化,该循环调用在不同文件中定义的函数。我知道你应该在函数上使用#pragma acc 例程装饰器,但我无法让它在我的程序中工作。

我正在使用 PGI 编译器,我得到以下输出

69, Loop is parallelizable
         Generating Multicore code
         69, #pragma acc loop gang
     72, Loop is parallelizable
         Loop not vectorized/parallelized: contains call 

产生此输出的主文件中的相关代码如下

ma​​in.c

#pragma acc routine seq
extern int determineColor(int, int, int*, int);


int main(int argc, char** argv){

        ....

        unsigned int(*imageBuffer)[yDim] = malloc(sizeof(int[xDim][yDim]));

        #pragma acc kernels loop
        for (int y = 0; y < yDim; y++)
        {
            for (int x = 0; x < xDim; x++)
            {
                imageBuffer[x][y] = determineColor(x, y, points, numPoints);
            }
        }
}

Voronoi.c

#pragma acc routine seq
int determineColor(int x, int y, int* points, int numPoints)
{
   ...
}

【问题讨论】:

    标签: c openacc pgi


    【解决方案1】:

    我假设您使用标志“-Minfo”,因此会获得所有编译器反馈,包括主机代码生成,而不仅仅是 OpenACC 的反馈。

    69, Loop is parallelizable
             Generating Multicore code
             69, #pragma acc loop gang
    

    这个 OpenACC 输出看起来是正确的,因为编译器成功地并行化了外部“y”循环并应用了 gang 调度。

     72, Loop is parallelizable
    

    此 OpenACC 消息表明循环可以并行化。但是,在针对多核 CPU 时,仅应用了组级并行性。如果针对 Tesla 设备,编译器很可能会使用向量调度来调度内部循环。

    困惑来了:

         Loop not vectorized/parallelized: contains call 
    

    这是一个主机代码生成反馈消息,指示内部循环由于调用而没有被 vecotrized。 “并行化”用于主机端自动并行(即 -Mconcur 标志),在这种情况下不适用。

    注意,您可以通过添加子选项“-Minfo=accel”来限制仅针对 OpenACC 的反馈消息。

    希望这会有所帮助!

    【讨论】:

    • 所以如果我理解正确,第二个循环不会因为我使用多核目标而被并行化?并感谢您的反馈
    • 正确。以多核 CPU 为目标时,只有单级线程并行性。编译器可能会应用矢量化(这是一种并行化形式),但由于调用原因,在这种情况下不会。
    猜你喜欢
    • 2014-01-31
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2015-10-22
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多