打开ACC:没有PGI编译器的输出

时间:2014-02-04 08:02:17

标签: gpu hpc openacc

我是在实习期间正在学习开放式ACC的本科生。

我自己为测试PGI工作站编译器(版本14.1)制作了基本的示例代码,并且使用了命令行指令'pgcc -acc lab04.c -Minfo'

但我有一个奇怪的问题。 @@任何地方都没有输出!! @@

我确信编译器运行良好,内核也是如此。但我猜想肯定会有错误。

你能帮帮我吗?

我会发布完整的代码。

#include <stdio.h>
#include <stdlib.h>


float scaled(float* v1, float* v2, float a, int n)
{
int i;
float sum = 0.0f;

#pragma acc kernels loop
for(i=0;i<n;i++)
{
    v1[i]+=a*v2[i];
    sum+=v1[i];
}

return sum;
}

int main(int argc, char* argv[])
{
int n;

float *vector1;
float *vector2;

if( argc > 1 )
    n = atoi( argv[1] );
else
    n = 100000;
if( n <= 0 ) n = 100000;


vector1=(float*)malloc(n*sizeof(float));
vector2=(float*)malloc(n*sizeof(float));


scaled(vector1, vector2, 3.3, n);


printf("programming done\n");

return 0;

}

2 个答案:

答案 0 :(得分:2)

我尝试使用PGI 13.10编译器工具使用以下命令行编译程序:

pgcc -acc -ta=nvidia,cc20,cuda5.0 -o t1 t1.c -Minfo

得到了这个输出:

scaled:
 10, Generating present_or_copy(v1[0:n])
     Generating present_or_copyin(v2[0:n])
     Generating NVIDIA code
     Generating compute capability 2.0 binary
 11, Complex loop carried dependence of '*(v2)' prevents parallelization
     Loop carried dependence of '*(v1)' prevents parallelization
     Loop carried backward dependence of '*(v1)' prevents vectorization
     Accelerator scalar kernel generated
 14, Sum reduction generated for sum

虽然这确实表明编译“成功”,但是关于“防止并行化”的消息表明编译器在成功中真正利用了加速器。当您看到消息Accelerator scalar kernel generated时,您通常会对结果不满意。

当我运行上面编译的程序时,我确实遇到了运行时错误:

call to cuLaunchKernel returned error 701: Launch out of resources

这是来自CUDA运行时子系统的错误。您可能会或可能不会看到此类错误,具体取决于您尝试运行的加速器设备类型。我们可以深入研究如何解决这个问题,但实际上并非如此,因为你的程序没有适当的结构来利用加速器。

编译器正在发出“阻止并行化”消息,因为它对指针vector1(或v1)和vector2(或v2)严格控制。它假设这些指针可以相互别名,因此在这种情况下无法创建正确的并行程序。由于这可能不是您的意图(您可能希望v1v2引用单独的空格),您可以通过使用C99修改scaled函数参数来“安抚”编译器{ {1}}关键字。这允许编译器以您可能想要的方式完成其工作。

以下是经过修改的代码和结果:

restrict

如果您无法获得这些结果,那么您尝试运行的机器/工具可能会出现问题。

答案 1 :(得分:1)

仅供参考,我能够在PGI用户论坛上帮助该用户(参见:http://www.pgroup.com/userforum/viewtopic.php?t=4164)。除了罗伯特指出的指针别名问题,他还使用了较旧的NVIDIA GPU,默认情况下不再使用它,需要添加“-ta = tesla:cc10”。

请注意,14.1中添加了“特斯拉”目标。对于早期版本,请将“tesla”替换为“nvidia”。