CUDA:Fermi (Tesla M2090) 无故生成 CUDA_EXCEPTION_10

xiaohuochai 阅读:11 2024-02-27 23:08:18 评论:0

我有一小段代码可以在 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],fermi 抛出 CUDA_EXCEPTION_10,设备非法地址。但事实并非如此。地址合法。

谁能帮我解决这个问题。


我的驱动代码是

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; 

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


标签:Exception
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号