【发布时间】: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