Witam
Jestem nowym uzytko0wnikiem tego forum. Bardzo proszę o pomoc z programem do splotu maski z obrazem tiff z wykorzystaniem technologi CUDA.
Ten sam program działający na procesorze działa poprawnie. Podczas prób przerobienia go na GPU występuje problem. Program kompiluje się prawidłowo uruchamia się również ale niestety błędnie liczy.
Poniżej funkcja obliczeniowa dla CPU:
char splotCPU(unsigned char *wejscie,int rozmiar, int *maska)
{
////////////////////////////////////////////////////////////////////////////////
// Funkcja nakładająca maske na tablicę. Na wejsciu otrzymuje //
// zestaw pikseli (9) oraz maskę do nałozenia, zwraca wartość //
// piksela //
////////////////////////////////////////////////////////////////////////////////
char wynik; //wartość piksela po nałozeniu maski
wynik=( wejscie[0]* maska[0]+
wejscie[1]* maska[1]+
wejscie[2]* maska[2]+
wejscie[3]* maska[3]+
wejscie[4]* maska[4]+
wejscie[5]* maska[5]+
wejscie[6]* maska[6]+
wejscie[7]* maska[7]+
wejscie[8]* maska[8])/9 ;
return wynik;
}
podobna funkcja dla GPU:
__global__ void splotGPU(unsigned char *wejscie,int rozmiar, int *maska,unsigned char *wynik)
{
////////////////////////////////////////////////////////////////////////////////
// Funkcja nakładająca maske na tablicę. Na wejsciu otrzymuje //
// zestaw pikseli (9) oraz maskę do nałozenia, zwraca wartość //
// piksela //
///////////////////////////////////////////////////////////////////////////////
//int id = blockIdx.x * blockDim.x + threadIdx.x;
wynik[0]=( wejscie[0]* maska[0]+
wejscie[1]* maska[1]+
wejscie[2]* maska[2]+
wejscie[3]* maska[3]+
wejscie[4]* maska[4]+
wejscie[5]* maska[5]+
wejscie[6]* maska[6]+
wejscie[7]* maska[7]+
wejscie[8]* maska[8])/9 ;
}
Poniżej użycie funkcji dla CPU:
wyR[i]=splotCPU(tabR,3, wekM);
wyG[i]=splotCPU(tabG,3, wekM);
wyB[i]=splotCPU(tabB,3, wekM);
gdzie:
wyR[i] - wektor wynikowy dla wartość R (czerwonych)
wyG[i] - wektor wynikowy dla wartość G (zielonych)
wyB[i] - wektor wynikowy dla wartość B (niebieskich)
wekM - wektor jednowymiarowy zawierający wartości maski Laplaca
tabR, tabG, tabG - wektory wejściowe dla poszczególnych kolorów
Program działa poprawnie wylicza odpowiednio dane.
Dla GPU:
cudaMemcpy(wynGR, tabGPU_R, size, cudaMemcpyHostToDevice);
splotGPU<<<dimGrid , dimBlock>>>(tabGPU_R , 3 , wekM , rezultat_Device_R);
cudaThreadSynchronize(); // synchronizacja
cudaMemcpy(rezultat_Device_R,temp_R, size_resultat, cudaMemcpyDeviceToHost);
gdzie:
wynGR - wektor z wejściowy dla GPU(Device) dla R(czerwony)
tabGPU_R - wektor z wejściowy dla CPU(Host) dla R(czerwony)
size - wielkość wynGR czyli "size_t size = sizeof(unsigned char) * 9;"
wekM - wektor jednowymiarowy zawierający wartości maski Laplaca
rezultat_Device_R - wektor wyjściowy dla GPU(Device) dla R(czerwony)
temp_R - wektor wyjściowy dla CPU(Host) dla R(czerwony)
size_resultat - wielkość rezultat_Device_R czyli "size_t size_resultat = sizeof(unsigned char);"
Identycznie postępuje z innymi kolorami.
Niestety ale temp_R , temp_G oraz temp_B czyli wartości zwracane z funkcji są zawsze stałe niezależnie od danych wejściowych. Są równe dla wszystkich kolorów chociaż wartości poszczególnych kolorów dla piksla są różne.
Bardzo proszę o pomoc.