CUDA内核随机失败,但只有在使用某些超越函数时才会失败

CUDA内核随机失败,但只有在使用某些超越函数时才会失败,cuda,Cuda,我一直在开发一个CUDA程序,该程序会因未指定的启动失败而随机崩溃,相当频繁。通过仔细的调试,我确定了哪个内核出现了故障,而且只有在从CUDA内核中调用某些超越函数时才会出现故障(例如sinf()或atanhf()) 这让我编写了一个简单得多的程序(见下文),以确认这些超越函数确实引起了一个问题,看起来情况确实如此。当我编译并运行下面的代码时,它只是重复调用使用tanh和atanh的内核,有时程序会重复工作,有时它会打印内核错误,并显示来自驱动程序的消息,其中说: NVRM:XiD(0000:0

我一直在开发一个CUDA程序,该程序会因
未指定的启动失败而随机崩溃
,相当频繁。通过仔细的调试,我确定了哪个内核出现了故障,而且只有在从CUDA内核中调用某些超越函数时才会出现故障(例如
sinf()
atanhf()

这让我编写了一个简单得多的程序(见下文),以确认这些超越函数确实引起了一个问题,看起来情况确实如此。当我编译并运行下面的代码时,它只是重复调用使用tanh和atanh的内核,有时程序会重复工作,有时它会打印
内核错误
,并显示来自驱动程序的消息,其中说:

NVRM:XiD(0000:01:00):130002000000000050C000000368000000080

关于频率,我运行可执行文件的时间可能有50%会崩溃

从我在网上读到的内容来看,这听起来像是XiD 13类似于基于主机的seg故障。然而,考虑到数组索引,我看不出会是什么情况。此外,如果我将内核中的超越函数替换为其他函数(例如重复的浮点减法和加法),程序不会崩溃。也就是说,我没有得到XiD错误消息,程序最终返回正确的atanh值(0.7)

我正在Ubuntu 11.10 x64桌面上运行cuda-5.0。驱动程序版本是304.54,我使用的是GeForce 9800 GTX

我倾向于说这是硬件问题或驱动程序错误。奇怪的是,nvidia的示例应用程序运行良好,可能是因为它们没有使用受影响的超越函数

最后一点潜在的重要信息是,如果我在cuda memcheck下运行我的主项目或这个测试程序,它不会报告错误,也不会崩溃。老实说,我只是在cuda memcheck下运行我的项目,但是性能的下降使它变得不切实际

提前感谢您在此提供的任何帮助/见解。如果任何人有一个9800 GTX,并愿意运行此代码,看看它是否工作,这将是非常感谢

#include <iostream>
#include <stdlib.h>

using namespace std;

__global__ void test_trans (float *a, int length) {
  if ((threadIdx.x + blockDim.x*blockIdx.x) < length) {
    float temp=0.7;
    for (int i=0;i<100;i++) {
      temp=atanh(temp);
      temp=tanh(temp);
    }
    a[threadIdx.x+ blockDim.x*blockIdx.x] = atanh(temp);
  }
}

int main () {
  float *array_dev;
  float *array_host;
  unsigned int size=10000000;
  if (cudaSuccess != cudaMalloc ((void**)&array_dev, size*sizeof(float)) ) {
    cerr << "Error with memory Allocation\n"; exit (-1);}
  array_host = new float [size];

  for (int i=0;i<10;i++) {
    test_trans <<< size/512+1, 512 >>> (array_dev, size);
    if (cudaSuccess != cudaDeviceSynchronize()) {
       cerr << "Error with kernel\n"; exit (-1);}
  }
  cudaMemcpy (array_host, array_dev, sizeof(float)*size, cudaMemcpyDeviceToHost);

  cout << array_host[size-1] << "\n";  
}
#包括
#包括
使用名称空间std;
__全局无效测试传输(浮点*a,整数长度){
if((threadIdx.x+blockDim.x*blockIdx.x)对于(int i=0;i询问者确定这是一个由较新的CUDA版本修复的临时问题。请参阅对原始问题的编辑。

这听起来像是一个硬件问题。我可以在compute 1.2设备上正常运行此代码,而不会出现任何错误消息或崩溃。如果您在CUDA开发人员程序中注册,您可能会遇到这种错误。这可能已通过最新的驱动程序和CUDA版本修复。