Странное поведение CUDA в программе векторного умножения - PullRequest
1 голос
/ 03 июля 2010

У меня проблемы с очень простой программой 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 должны быть равны.

Проблема заключается в следующем

  1. Сначала я вызываю ядрос N=16 и nThreads<16, который не работает.(Это нормально)
  2. Затем я называю это с N=16 и nThreads=16, что прекрасно работает.(Опять работает как положено)
  3. Но когда я вызываю его с N=16 и nThreads<16, он все равно работает!

Я не понимаю, почему последний шаг нетерпеть неудачу, как первый.Сбой снова произойдет только после перезагрузки компьютера.

Кто-нибудь сталкивался с чем-то подобным или может объяснить это поведение?

Ответы [ 2 ]

2 голосов
/ 03 июля 2010

Подожди, так ты звонишь всем трем подряд?Я не знаю остальную часть вашего кода, но вы уверены, что очищаете графическую память, которую вы выделяли между каждым запуском?Если нет, это может объяснить, почему он не работает в первый раз, но работает в третий раз, когда вы передаете те же значения, и почему он работает только после перезагрузки (перезагрузка очищает всю выделенную память).

1 голос
/ 03 июля 2010

Не знаю, нормально ли отвечать на мой собственный вопрос, но я понял, что у меня была ошибка в моем коде при сравнении векторов хоста и устройства (эта часть кода не была опубликована).Приносим извинения за неудобства.Может кто-нибудь закрыть это сообщение, так как оно не позволит мне удалить его?

...