У меня есть небольшой фрагмент кода, который отлично работает на старой архитектуре 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;
}