求最大值

struct Rvalue
{
float R;
int Rpositon;
};
/////////////////////kernel////////////////////////
//xR*yR是 RR的尺寸大小
//实现就R的最大值和位置,其中R就是值,Rpositon就是位置

int x=blockIdx.xblockDim.x+threadIdx.x;
int y=blockIdx.y
blockDim.y+threadIdx.y;
int tx=threadIdx.x;
int ty=threadIdx.y;
Rvalue* RR=(Rvalue*)Rdata;
if(y<yR&&x<xR)
RR[yxR+x].Rpositon=yxR+x;//给Rpositon赋值
…//计算RR[y*xR+x].R的值

//每个block内对RR求最大值和位置
__syncthreads();
int tid=threadIdx.yblockDim.x+threadIdx.x;
int bid=blockIdx.y
gridDim.x+blockIdx.x;
int bidsize=bidblockIdx.xblockIdx.y;

if(bidsize+tid+128<xR*yR)
{
	if(tid<128)
	{
		if(RR[bidsize+tid].R<RR[bidsize+tid+128].R)
		{
			RR[bidsize+tid].R=RR[bidsize+tid+128].R;
			RR[bidsize+tid].Rpositon=RR[bidsize+tid+128].Rpositon;
		}
	}
}
__syncthreads();
if(bidsize+tid+64<xR*yR)
{
	if(tid<64)
	{
		if(RR[bidsize+tid].R<RR[bidsize+tid+64].R)
		{
			RR[bidsize+tid].R=RR[bidsize+tid+64].R;
			RR[bidsize+tid].Rpositon=RR[bidsize+tid+64].Rpositon;
		}
	}
}
__syncthreads();
if(bidsize+tid+32<xR*yR)
{
	if(tid<32)
	{
		if(RR[bidsize+tid].R<RR[bidsize+tid+32].R)
		{
			RR[bidsize+tid].R=RR[bidsize+tid+32].R;
			RR[bidsize+tid].Rpositon=RR[bidsize+tid+32].Rpositon;
		}
	}
}
__syncthreads();
if(bidsize+tid+16<xR*yR)
{
	if(tid<16)
	{
		if(RR[bidsize+tid].R<RR[bidsize+tid+16].R)
		{
			RR[bidsize+tid].R=RR[bidsize+tid+16].R;
			RR[bidsize+tid].Rpositon=RR[bidsize+tid+16].Rpositon;
		}
	}
}
__syncthreads();
if(bidsize+tid+8<xR*yR)
{
	if(tid<8)
	{
		if(RR[bidsize+tid].R<RR[bidsize+tid+8].R)
		{
			RR[bidsize+tid].R=RR[bidsize+tid+8].R;
			RR[bidsize+tid].Rpositon=RR[bidsize+tid+8].Rpositon;
		}
	}
}
__syncthreads();
if(bidsize+tid+4<xR*yR)
{
	if(tid<4)
	{
		if(RR[bidsize+tid].R<RR[bidsize+tid+4].R)
		{
			RR[bidsize+tid].R=RR[bidsize+tid+4].R;
			RR[bidsize+tid].Rpositon=RR[bidsize+tid+4].Rpositon;
		}
	}
}
__syncthreads();
if(bidsize+tid+2<xR*yR)
{
	if(tid<2)
	{
		if(RR[bidsize+tid].R<RR[bidsize+tid+2].R)
		{
			RR[bidsize+tid].R=RR[bidsize+tid+2].R;
			RR[bidsize+tid].Rpositon=RR[bidsize+tid+2].Rpositon;
		}
	}
}
__syncthreads();
if(bidsize+tid+1<xR*yR)
{
	if(tid<1)
	{
		if(RR[bidsize+tid].R<RR[bidsize+tid+1].R)
		{
			RR[bidsize+tid].R=RR[bidsize+tid+1].R;
			RR[bidsize+tid].Rpositon=RR[bidsize+tid+1].Rpositon;
			
		}
		
	}
	
}
__syncthreads();

错在哪?程序要求Rvalue中R的最大值和位置

[ 本帖最后由 图腾部落 于 2010-6-17 11:10 编辑 ]

bidsize+tid,每个block看上去好像是128 线程算256数据
这样的话bidsize应该乘以2,并且block数量应该减半才对

可能还有其他问题