我有一小段代码可以在 Nvidia 旧架构(Tesla T10 处理器)上完美运行,但不能在 Fermi(Tesla M2090)上运行
我了解到费米的行为略有不同。由于哪些不安全的代码可能在旧架构上正常工作,而在 Fermi 上它捕获了错误。
但我不知道如何解决它。
这是我的代码:

因为我正在访问 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;
}

最佳答案

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;

将指针传递给越界的设备。

关于CUDA:费米(Tesla M2090)无故生成CUDA_EXCEPTION_10,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6512118/

10-11 20:39