CUDA:费米(特斯拉M2090)毫无理由地生成CUDA_EXCEPTION_10

ved*_*eda 3 cuda

我有一小段代码在Nvidia旧架构(特斯拉T10处理器)上运行完美但在费米(特斯拉M2090)上没有

我了解到费米的表现略有不同.由于哪些不安全的代码可能在旧架构上正常工作,而在Fermi上它捕获了bug.

但我不知道如何解决它.

这是我的代码:

__global__ void exec(int*arr_ptr,int size,int*result){

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

    *result = arr_ptr[-2];
Run Code Online (Sandbox Code Playgroud)

}

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);
Run Code Online (Sandbox Code Playgroud)

}

因为我正在访问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;
Run Code Online (Sandbox Code Playgroud)

}

tal*_*ies 6

费米卡在设备上具有更好的内存保护,并且可以检测出在旧卡上"工作"的超出条件.使用cuda-memchk(或cuda-gdb中的cuda-memchk模式)来更好地处理出错的地方.


编辑:

这是罪魁祸首:

cudaMalloc((void**)&arr_dev, 10);
Run Code Online (Sandbox Code Playgroud)

应该是

cudaMalloc((void**)&arr_dev, 10*sizeof(int));
Run Code Online (Sandbox Code Playgroud)

这将导致此代码

int *arr_ptr = arr_dev + 5;
Run Code Online (Sandbox Code Playgroud)

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