Próbuję rozwiązać problem na końcu lekcji 1 kursu Udacity, ale nie jestem pewien, czy zrobiłem głupią literówkę, czy też kod jest nieprawidłowy.Zamieszanie przez siatkę i wymiary bloku
void your_rgba_to_greyscale(const uchar4 * const h_rgbaImage, uchar4 * const d_rgbaImage, unsigned char* const d_greyImage, size_t numRows, size_t numCols)
{
size_t totalPixels = numRows * numCols;
size_t gridRows = totalPixels/32;
size_t gridCols = totalPixels/32;
const dim3 blockSize(32,32,1);
const dim3 gridSize(gridCols,gridRows,1);
rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);
cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError());
}
Druga metoda to:
void rgba_to_greyscale(const uchar4* const rgbaImage, unsigned char* const greyImage, int numRows, int numCols)
{
int x = (blockIdx.x * blockDim.x) + threadIdx.x;
int y = (blockIdx.y * blockDim.y) + threadIdx.y;
uchar4 rgba = rgbaImage[x * numCols + y];
float channelSum = 0.299f * rgba.x + 0.587f * rgba.y + 0.114f * rgba.z;
greyImage[x * numCols + y] = channelSum;
}
Komunikat o błędzie mówi, co następuje: libdc1394 błędu: Nie można zainicjować libdc1394 błąd Cuda na student_func.cu:76 nieokreślony awarii uruchomienie cudaGetLastError() nie mogliśmy wykonać Twojego kodu. Czy poprawnie ustawiłeś siatkę i/lub rozmiar bloku?
Twój kod skompilowany! błąd wyjścia: libdc1394 błąd: Nie można zainicjować libdc1394 błąd Cuda na student_func.cu:76 nieokreślonym cudaGetLastError awarii Launch()
Linia 76 jest ostatni wiersz w pierwszym bloku kodu i ile im świadomość i przystań zmieniłem cokolwiek w nim. Nie mogę znaleźć deklaracji cudaGetLastError().
Mam głównie na uwadze moją wiedzę na temat ustawiania wymiarów siatki/bloku + czy pierwsze podejście do metody było właściwe w odniesieniu do mapowania między tablicą 1D pozycji piksela a moimi wątkami.
EDYCJA: Chyba coś źle zrozumiałem. NumRows = liczba pikseli w pionie? numCols = piksele w kierunku poziomym? Mój blok składa się z wątków 8 x 8, gdzie każdy wątek reprezentuje 1 piksel? Jeśli tak, zakładam, że to dlatego musiałem podzielić przez 4 przy obliczaniu siatkiRozmiar, ponieważ obraz nie jest kwadratowy? Zakładam, że mógłbym również utworzyć blok, który byłby kolumnami 2: 1: wiersze?
EDIT 2: po prostu starał się zmienić swój blok tak, że było 2: 1 stosunek, więc mogę podzielić NumRows i numCol o tym samym numerze, ale jego teraz pokazując puste obszary w dno i bok. Dlaczego istnieją puste obszary zarówno na dole, jak i na boku. Nie zmieniłem wymiarów y według siatki lub bloku.
jest jeszcze jeden błąd w jądrze, zobacz odpowiedź. również nie trzeba dzielić przez różne numery lub dwa razy pokryjesz kilka pikseli lub stracisz trochę – ShPavel