struct Rvalue
{
float R;
int Rpositon;
};
/////////////////////kernel////////////////////////
//xR*yR是 RR的尺寸大小
//实现就R的最大值和位置,其中R就是值,Rpositon就是位置
int x=blockIdx.xblockDim.x+threadIdx.x;
int y=blockIdx.yblockDim.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.ygridDim.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 编辑 ]