Я реализовал численный алгоритм на 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, моя программа может гарантировать успешную работу.Я хочу знать причину.Есть ли разница между потоками для выполнения функции ядра?