一个简单的求最大最小值的代码,但是最小值出错...

求指点…为什么最大值正常,最小值却全是0…郁闷啊
global void CimaxCalc(int Nf,float* input,float* CiMax,float* CiMin)
{
unsigned int s=Nf/2;
int tid = blockDim.xblockIdx.x + threadIdx.x;
if(tid<Nf)
{
CiMin[tid]=input[tid];
CiMax[tid]=input[tid];
__syncthreads();
s=Nf/2;
while(s>0)
{
if(tid<s)
{
if(CiMin[tid]>CiMin[tid+s])
CiMin[tid]=CiMin[tid+s];
if(CiMax[tid]<CiMax[tid+s])
CiMax[tid]=CiMax[tid+s];
__syncthreads();
if((0.5
s-s/2)!=0&&s!=1)
{
s++;
CiMax[s-1]=CiMin[s-1]=0;
}
s>>=1;
}
else
break;
__syncthreads();
}
__syncthreads();
}
__syncthreads();
}

你的肯定会有错啊CiMax[s-1]=CiMin[s-1]=0;赋值0当然不对了。

我帮你改了一下,下面的代码在你的基础上改了一点点,修改过的部分我加了注释,具有通用性。不过你的这个代码效率很低。呵呵

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#include<cuda.h>
#include<cutil.h>
#define Nf 45

global void CimaxCalc(float* input,float* CiMax,float* CiMin)
{
unsigned int s=Nf/2;
unsigned int ss=Nf;//这一部分是为了判断奇数还是偶数
int tid = blockDim.x*blockIdx.x + threadIdx.x;

if(tid<Nf)
{
CiMin[tid]=input[tid];
CiMax[tid]=input[tid];
__syncthreads();
s=Nf/2;
while(s>0)
{
if(tid<s)
{
if(CiMin[tid]>CiMin[tid+s])
CiMin[tid]=CiMin[tid+s];
if(CiMax[tid]<CiMax[tid+s])
CiMax[tid]=CiMax[tid+s];
__syncthreads();
if((0.5*ss-ss/2)!=0) //用ss判断
{
s++;
if(tid==0)
{
CiMax[s-1]=CiMax[ss-1];//这一部分是将最后一个数赋值给 CiMax[s-1],而不是用0赋值。
CiMin[s-1]=CiMin[ss-1];
}
}
ss=s;//ss更新
s>>=1;
}
else
break;
__syncthreads();
}
__syncthreads();
}
__syncthreads();
}

int main (int argc, char **argv)
{
float *h_input,*h_mi,*h_ma;
float *input,*CiMax,*CiMin;

int size_a=Nf*sizeof(float);

h_input=(float*)malloc(size_a);
h_ma=(float*)malloc(sizeof(float));
h_mi=(float*)malloc(sizeof(float));

cudaMalloc((void**)&CiMax,size_a);
cudaMalloc((void**)&CiMin,size_a);
cudaMalloc((void**)&input,size_a);

for (int i=0;i<Nf;i++)
h_input[i]=(float)(i+1);

cudaMemcpy(input,h_input, size_a,cudaMemcpyHostToDevice);

CimaxCalc<<<8,32>>>(input, CiMax, CiMin);

cudaMemcpy(h_mi,CiMin,sizeof(float),cudaMemcpyDeviceToHost);
cudaMemcpy(h_ma,CiMax,sizeof(float),cudaMemcpyDeviceToHost);

printf(“\n%f\n”,*h_mi);
printf(“%f”,*h_ma);

getchar();
return 1;

}

我的代码是不是因为Block没有同步的原因?

代码是不是也有点问题啊,比如,把 Nf 定义成 45,第一次循环 s=22, 22是偶数,就跳过了下面的判断语句:
if((0.5s-s/2)!=0&&s!=1)
{
s++;
if(tid==32)
{
CiMax[s-1]=CiMax[2
(s-1)-b];//这一部分是将最后一个数赋值给 CiMax[s-1],而不是用0赋值。
CiMin[s-1]=CiMin[2*(s-1)-b];
}
}

那最大值45不就被跳过了~

Nf始终是偶数

[

当时没仔细看,上面的你不要用s判断奇数,用ss判断,你再试一下上面的代码,这次没问题啦

[

上面的你不要用s判断奇数,用ss判断,你再试一下上面的代码,没问题啦

嗯嗯,:D~
您好,我有一个问题需要帮忙,能加一下我的q吗?
568497060