0

我是本科生,正在实习中学习开放式 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;

}
4

2 回答 2

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编译器发出“防止并行化”消息,因为它对指针(or v1) 和vector2(or )非常严格v2。它假定这些指针可以相互别名,因此在这种情况下无法创建正确的并行程序。由于这可能不是您的意图(您可能打算v1v2引用单独的空格),您可以通过scaled使用 C99restrict关键字修改函数参数来“放心”编译器。这允许编译器按照您可能想要的方式完成其工作。

这是修改后的代码和结果:

$ cat t1.c
#include <stdio.h>
#include <stdlib.h>

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

  #pragma acc kernels
  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;

}

$ 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, Loop is parallelizable
         Accelerator kernel generated
         11, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
     14, Sum reduction generated for sum
$ ./t1
programming done
$

如果您无法获得这样的结果,则您尝试运行的机器/工具可能存在问题。

于 2014-02-05T17:06:00.913 回答
1

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

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

于 2014-02-06T22:11:40.717 回答