在并行处理中将线程平均分配给列

时间:2019-06-20 03:47:28

标签: c++ multithreading parallel-processing cuda

我目前正在使用将高斯模糊应用于图像的程序,我为图像的一定数量的列分配了一个线程,以便使用并行模型对其进行处理。我遇到的问题是,我将线程分配给列的方式是,从第一个线程到倒数第二个线程都在为相同数量的线程工作,但最后一个是占用整个分区的所有列由于除法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("");
}
​```


0 个答案:

没有答案