我有一小段代码在Nvidia旧架构(特斯拉T10处理器)上运行完美但在费米(特斯拉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;
}
答案 0 :(得分:6)
费米卡在设备上具有更好的内存保护功能,并且可以检测到出现在旧卡上“工作”的超出条件。使用cuda-memchk(或cuda-gdb中的cuda-memchk模式)来更好地处理出错的地方。
编辑:
这是罪魁祸首:
cudaMalloc((void**)&arr_dev, 10);
应该是
cudaMalloc((void**)&arr_dev, 10*sizeof(int));
这将导致此代码
int *arr_ptr = arr_dev + 5;
将指针传递给超出界限的设备。