我是在实习期间正在学习开放式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;
}
答案 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
)严格控制。它假设这些指针可以相互别名,因此在这种情况下无法创建正确的并行程序。由于这可能不是您的意图(您可能希望v1
和v2
引用单独的空格),您可以通过使用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”。