Озадаченный об ошибке CUDA "Деформация адреса вне диапазона" - PullRequest
0 голосов
/ 01 марта 2012

Я реализовал численный алгоритм на GPU с CUDA.Сначала я установил gridDim <32, 1, 1> и blockDim <1, 1, 1>, программа выдавала ошибку «Адрес деформации вне диапазона» в строке, в которой были задействованы только некоторые основные арифметические операции.(Я знаю, что указанное местоположение этой ошибки не является точным, и я попытался выяснить точное положение этой ошибки, комментируя и исключая поиск, но, похоже, эта ошибка возникла из ниоткуда!).

И если я изменю комбинацию gridDim <32, 1, 1> и blockDim на <32, 1, 1>, программа будет работать отлично!И я также попробовал комбинацию gridDim <1, 1, 1> и blockdim <1, 1, 1>, программа также работает нормально.Может кто-нибудь сказать мне несколько возможных причин для этого?


ОБНОВЛЕНИЕ: я обнаружил, что моя программа может аварийно завершить работу, если только не запущен только один поток.И авария непредсказуема.И если я запустил несколько потоков, но позволил только одному потоку выполнять функцию ядра, например:

__global__ kernel<<<32, 32>>>{
    int tid = blockDim.x * blockIdx.x + threadIdx.x;
    if(tid != XXX)
        return;
    else{
        ...
    }

}

, я обнаружил, что только когда XXX равен 0, моя программа может гарантировать успешную работу.Я хочу знать причину.Есть ли разница между потоками для выполнения функции ядра?

1 Ответ

1 голос
/ 01 марта 2012

Вы рассчитываете неправильный tid.

tid рассчитывается как:

int tid = blockIdx.x * blockDim.x + threadIdx.x;

...