У меня проблемы с очень простой программой CUDA.У меня есть программа, которая умножает два вектора на хосте и на устройстве, а затем сравнивает их.Это работает без проблем.Неправильно то, что я пытаюсь протестировать различное количество потоков и блоков в учебных целях.У меня есть следующее ядро:
__global__ void multiplyVectorsCUDA(float *a,float *b, float *c, int N){
int idx = threadIdx.x;
if (idx<N)
c[idx] = a[idx]*b[idx];
}
, которое я называю как:
multiplyVectorsCUDA <<<nBlocks, nThreads>>> (vector_a_d,vector_b_d,vector_c_d,N);
На данный момент я установил nBLocks
в 1, поэтому я изменяю только размер вектора N
а количество потоков nThreads
.Из того, что я понимаю, будет поток для каждого умножения, поэтому N
и nThreads
должны быть равны.
Проблема заключается в следующем
- Сначала я вызываю ядрос
N=16
и nThreads<16
, который не работает.(Это нормально) - Затем я называю это с
N=16
и nThreads=16
, что прекрасно работает.(Опять работает как положено) - Но когда я вызываю его с
N=16
и nThreads<16
, он все равно работает!
Я не понимаю, почему последний шаг нетерпеть неудачу, как первый.Сбой снова произойдет только после перезагрузки компьютера.
Кто-нибудь сталкивался с чем-то подобным или может объяснить это поведение?