Próbowałem dowiedzieć się, jak zrobić to, co uważałem za proste jądro, aby wziąć średnią z wartości w matrycy 2d, ale mam pewne problemy z procesem myślowym.ustalenie, ile bloków i wątków dla jądra cuda, i jak z nich korzystać
Zgodnie z danymi mojego urządzenia deviceQuery, mój układ GPU ma 16MP, 32cores/mp, bloki max to 1024x1024x64 i mam max wątków/bloków = 1024.
Pracuję więc nad przetwarzaniem niektórych dużych obrazów. Może 5000px x 3500px lub coś w tym stylu. Jedno z moich ziaren pobiera średnią wartości z wszystkich pikseli w obrazie.
Istniejący kod zawiera obrazy przechowywane jako tablica 2D [wiersze] [cols]. Tak, że jądro w C wygląda tak, jak można by oczekiwać, z pętlą nad wierszami i pętlą nad colami, z kalkulacją w środku.
Jak skonfigurować część obliczeniową wymiaru tego kodu w CUDA? Przyjrzałem się kodowi redukcji w SDK, ale dotyczy to tablicy jednowymiarowej. To nie ma żadnej wzmianki o tym, jak ustawić liczbę bloków i wątków, gdy masz tok 2D.
myślę ja faktycznie trzeba go ustawić tak jak i to, gdzie chciałbym, aby ktoś w gong i pomoc:
num_threads=1024;
blocksX = num_cols/sqrt(num_threads);
blocksY = num_rows/sqrt(num_threads);
num_blocks = (num_rows*num_cols)/(blocksX*blocksY);
dim3 dimBlock(blocksX, blocksY, 1);
dim3 dimGrid(num_blocks, 1, 1);
Czy to wydaje się mieć sens dla konfiguracji ?
Następnie do jądra i działa w danym rzędzie lub kolumnie, to muszę używać
rowidx = (blockIdx.x * blockDim.x) + threadId.x colidx = (blockIdx. y * blockDim.y) + threadId.y
Przynajmniej sądzę, że to działałoby na uzyskanie wiersza i kolumny.
Jak uzyskać dostęp do tego wiersza r i kolumny c w jądrze? W instrukcji programowania CUDA znalazłem następujący kod:
// Host code int width = 64, height = 64;
float* devPtr; size_t pitch;
cudaMallocPitch(&devPtr, &pitch, width * sizeof(float), height);
MyKernel<<<100, 512>>>(devPtr, pitch, width, height);
// Device code __global__ void MyKernel(float* devPtr, size_t pitch, int width, int height)
{
for (int r = 0; r < height; ++r)
{
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c)
{
float element = row[c];
}
}
}
który wygląda podobnie do tego, jak byłoby użyć malloc w C zadeklarować tablicy 2D, ale to nie robi mieć żadnej wzmianki o dostępie tę tablicę w swoim jądrze . Zgaduję, że w moim kodzie użyję tego połączenia cudaMallocPitch, a następnie wykonam memcpy, aby wprowadzić moje dane do tablicy 2D na urządzeniu?
Wszelkie wskazówki są mile widziane! Dzięki!
Jeśli rozumiem, co robi iDivUP, możesz nieco uprościć logikę dzięki całkowitemu przycięciu: return (a + b-1)/b; –