【问题标题】:CUDA: Fermi (Tesla M2090) generating CUDA_EXCEPTION_10 without reasonCUDA:费米(特斯拉 M2090)无故生成 CUDA_EXCEPTION_10
【发布时间】:2011-06-29 05:00:24
【问题描述】:

我有一小段代码可以在 Nvidia 旧架构(Tesla T10 处理器)上完美运行,但不能在 Fermi(Tesla M2090)上运行

我了解到费米的行为略有不同。由于不安全的代码可能在旧架构上正常工作,而在 Fermi 上它会捕获错误。

但我不知道如何解决。

这是我的代码:

__global__void exec (int *arr_ptr, int size, int *result) {

    int tx = threadIdx.x;
    int ty = threadIdx.y;

    *result = arr_ptr[-2];

}

void run(int *arr_dev, int size, int *result) {

    cudaStream_t stream = 0;
    int *arr_ptr = arr_dev + 5;

    dim3 threads(1,1,1);
    dim3 grid (1,1);

    exec<<<grid, threads, 0, stream>>>(arr_ptr, size, result);

}

因为我正在访问arr_ptr[-2],所以费米会抛出CUDA_EXCEPTION_10, Device Illegal Address。但事实并非如此。地址是合法的。

谁能帮帮我。


我的驱动代码是

int main(){
    int *arr;
    int *arr_dev = NULL;
    int result = 1;

    arr = (int*)malloc(10*sizeof(int));

    for(int i = 0; i < 10; i++)
            arr[i] = i;

    if(arr_dev == NULL)
    {
            cudaMalloc((void**)&arr_dev, 10);
            cudaMemcpy(arr_dev, arr, 10*sizeof(int), cudaMemcpyHostToDevice);
    }

    run(arr_dev, 10, &result);
    printf("%d \n", result);
    return 0;

}

【问题讨论】:

  • 我不明白为什么它不应该工作。您能否验证/向我们展示代码,arr_dev result 指针是如何生成的?
  • cudaMalloc 调用使用了无效的大小。它应该是 10*sizeof(int)。

标签: cuda


【解决方案1】:

Fermi 卡在设备上具有更好的内存保护,并且会检测到似乎在旧卡上“工作”的越界情况。使用 cuda-memchk(或 cuda-gdb 中的 cuda-memchk 模式)更好地处理问题所在。


编辑:

这是罪魁祸首:

cudaMalloc((void**)&arr_dev, 10);

应该是

cudaMalloc((void**)&arr_dev, 10*sizeof(int));

这将导致此代码

int *arr_ptr = arr_dev + 5;

将指针传递给超出范围的设备。

【讨论】:

  • 你能解释一下“费米卡在设备上的内存保护要好得多”
  • Fermi 内存管理单元是一个更复杂的设计,它可以检测到许多旧硬件无法检测到的保护故障条件。
  • 谢谢,以上问题已解决。但是现在,我尝试了内存检查,发现 Invalid global read of size 4 == at 0x00000bf8 in == by thread (6,3,0) in block (0,0) == Address 0x6004b9ef8 is out of bounds ----这是否意味着我造成了错误。因为相同的代码适用于旧硬件。所以现在我不确定错误是由于我还是费米
  • 您的代码中有一些越界内存全局内存访问。仅仅因为代码似乎在旧硬件上“工作”并不意味着问题在两者上都没有发生,只是旧硬件没有检测到问题。
  • 哦,好吧...所以我正在做一些无效的全局内存访问。 mem-check 为我提供了发生错误的行,当我尝试手动计算地址时,我无法弄清楚。您是否知道除 cuda-gdb 之外的其他工具来查找错误。你有什么想法吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 2014-07-16
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多