Назначение потоков равным образом для столбцов при параллельной обработке - PullRequest
1 голос
/ 20 июня 2019

В настоящее время я работаю в программе, которая применяет размытие по Гауссу к изображению, я назначаю поток определенному количеству столбцов моего изображения, чтобы обработать его, используя параллельную модель.Проблема, с которой я сталкиваюсь, заключается в том, что при назначении потоков столбцам, от первого до предпоследнего потока, выполняют свою работу для того же количества потоков, но последний берет все столбцы, что и все делениеоставлен не назначенным другим темам, так как раздел columns/number of threads не был точным.

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

__global__ void ApplyBlur(double *image_d1, double *kernel, double *output, int width, int height, int kernelSize, int totalThreads)
{
    int id = blockDim.x * blockIdx.x + threadIdx.x;
​
    int filterHeight = kernelSize;
    int filterWidth = kernelSize;
    int newImageHeight = height-kernelSize+1;
    //int newImageHeight = height;
    int newImageWidth = width-kernelSize+1;
    int d,i,j,h,w;

    int fromY = (newImageHeight / totalThreads)*id;
    int toY = id != totalThreads-1 ? fromY + (newImageHeight / totalThreads) : newImageHeight;

    int fromX = (newImageWidth / totalThreads)*id;
    int toX = id != totalThreads-1 ? fromX + (newImageWidth / totalThreads) : newImageWidth;


    int numElements = sizeof(double) * 4 * newImageHeight * newImageWidth;

    for (i=0; i<newImageHeight ; i++) {
        for (j=fromX ; j<toX ; j++) {
            for(int k=0; k<4; k++){
                output[i*newImageWidth*4 + j*4 + k] = 0;
                for (h=i ; h<i+filterHeight ; h++) {
                    for (w=j ; w<j+filterWidth ; w++) {
                        output[i*newImageWidth*4 + j*4 + k] += kernel[(h-i) * kernelSize + (w-j)]*image_d1[h*width*4 + w*4 + k];
                    }
                }
            }
        }
    }

    printf("");
}
​```


...