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