我在cuda中的uu syncthreads()之后丢失了数据
我正在试图找到数组的最大值。。我接受了他的帮助。并做一些自己的修改。然而,我运行它的16个数据。我发现在内核代码中,共享内存只复制了前4个数据。其余的都失去了。我放了两个纸杯。第一个纸杯显示数据在共享内存中。但是第二杯就在同步线程之后。。这显示了线程ID 4中的0。。请帮忙 包括 包括 包括 包括 包括 包括铜 包括cuPrintf.cuh我在cuda中的uu syncthreads()之后丢失了数据,cuda,Cuda,我正在试图找到数组的最大值。。我接受了他的帮助。并做一些自己的修改。然而,我运行它的16个数据。我发现在内核代码中,共享内存只复制了前4个数据。其余的都失去了。我放了两个纸杯。第一个纸杯显示数据在共享内存中。但是第二杯就在同步线程之后。。这显示了线程ID 4中的0。。请帮忙 包括 包括 包括 包括 包括 包括铜 包括cuPrintf.cuh __device__ float MaxOf2(float a, float b) { if(a > b) return a; e
__device__ float MaxOf2(float a, float b)
{
if(a > b) return a;
else return b;
}
__global__ void findMax(int size,float *array_device , float *outPut)
{
extern __shared__ float sdata[];
int tid = threadIdx.x;
int i = blockIdx.x*blockDim.x + threadIdx.x;
if(i< size)
{
sdata[tid] = array_device[i];
cuPrintf(" array_d[%d]===%f, sdata[%d]===%f\n ",i,array_device[i],tid,sdata[tid]);
__threadfence();
}
__syncthreads();
if(tid<size)
cuPrintf(" array_d[%d]===%f, sdata[%d]===%f\n ",i,array_device[i],tid,sdata[tid]);
for ( int s=blockDim.x/2; s>0; s=s>>1)//s=blockDim.x/2
{
if (tid < s)
{
sdata[tid]= MaxOf2(sdata[tid],sdata[tid+s]);
}
__syncthreads();
}
if (tid == 0) outPut[blockIdx.x] = sdata[0];
}
int main()
{
long double M = pow(2,20);
long double N = 2;
int noThreadsPerBlock = 512 ;
printf("\n Provide the array Size N.(array will be of size N * 2^20 ) :-");
scanf("%Lf",&N);
long int size = 16;
int numOfBlock = (int)size /noThreadsPerBlock + 1;
printf("\n num of blocks==%ld",numOfBlock);
float *array_device , *outPut;
float array_host[]={221,100,2,340,47,36,500,1,33,4460,5,6,7,8,9,11};
cudaMalloc((void **)&array_device, size*sizeof(float));
cudaMalloc((void **)&outPut, size*sizeof(float));
cudaError_t error0 = cudaGetLastError();
printf("\n 0CUDA error: %s\n", cudaGetErrorString(error0));
printf("size===%ld",size);
cudaMemcpy(array_device, array_host, size*sizeof(float), cudaMemcpyHostToDevice);
cudaError_t error1 = cudaGetLastError();
printf("\n1CUDA error: %s\n", cudaGetErrorString(error1));
while(size>1 )
{
cudaPrintfInit();
findMax<<< numOfBlock,noThreadsPerBlock>>>(size,array_device, outPut);cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
cudaError_t error2 = cudaGetLastError();
printf(" 2CUDA error: %s\n", cudaGetErrorString(error2));
cudaMemcpy(array_device, outPut, size*sizeof(float), cudaMemcpyDeviceToDevice);
size = numOfBlock;
printf("\n ****size==%ld\n",size);
numOfBlock = (int)size /noThreadsPerBlock + 1;
}
cudaMemcpy(array_host, outPut, size*sizeof(float), cudaMemcpyDeviceToHost);
cudaError_t error3 = cudaGetLastError();
printf("\n3CUDA error: %s\n", cudaGetErrorString(error3));
for(int i=0;i<size;i++)
printf("\n index==%d ;data=%f ",i,array_host[i]);
return 0;
}
我将根据要求发表我的评论作为答复
首先,您没有在内核启动中指定共享内存的动态大小。它应该看起来像: findMax>
其次,条件背后的概念是什么?首先,您在内核启动时没有指定共享内存的动态大小。它应该是这样的:findMax>其次,如果真的需要发布大量注释掉的代码行,那么条件背后的概念是什么?您要求我们阅读并更正您的代码,至少要花时间将其正确格式化,以便我们易于阅读。帮助我们帮助你…我提出如果条件只是为了禁止这么多的打印,因为我只有16个数据。我试着把输出放进去。但是有一些问题需要保存,因为它给出了一些代码。你能把你的回答作为答案发布吗。很明显,海报会让这个问题落伍,让尘埃落定。由于您声明的第一个原因,发布的代码显然无法工作。我会投票支持你的答案。谢谢你的回答。这有助于我们将这些被抛弃的问题从无人回答的问题列表中删除。