版主您好 我编写的的程序,修改了很多次,也得不到最后的结果,如果处理一个小常数矩阵,得到其元素最大值能得到正确结果,因为这样只需一个grid就一个block,这样简单。可是如果是对一幅图像,由于数据量很大,必须一个grid有多个block,求出每一个block的最大值,这样编程时我就糊涂了,最糊涂的就是那个mid和那个tid的M_max[mid]=M_src[tid];这么编对不对,楼主帮我指点一下,程序如下
__global__ void MaxMinKernel(float *M_src,int width,int height,float*N_max,float*N_min)
{
int x=threadIdx.x+blockIdx.x*blockDim.x;
int y=threadIdx.y+blockIdx.y*blockDim.y;
int tid= y*width+x;
int mid=threadIdx.x+threadIdx.y*blockDim.x;
__shared__ float *M_max;
__shared__ float *M_min;
memset(M_max,0,blockDim.x*blockDim.y);
memset(M_min,0,blockDim.x*blockDim.y);
if(x<width&&y<height)
{
////////////////////////////////求最大最小值//////////////////////////////////
M_max[mid]=M_src[tid];
__syncthreads();
int i=(blockDim.x*blockDim.y)/2;
while(i !=0)
{
if(mid<i)
{
M_max[mid]=M_max[mid]>M_max[mid+i]?M_max[mid]:M_max[mid+i];
M_min[mid]=M_max[mid]<M_max[mid+i]?M_max[mid]:M_max[mid+i];
__syncthreads();
i/=2;
}
}
if(mid=0)
{
N_max[blockIdx.x+gridDim.x*blockIdx.y]=M_max[mid];
N_min[blockIdx.x+gridDim.x*blockIdx.y]=M_min[mid];
}
}
}
|