找回密码
 立即注册
lugui2009 该用户已被删除
发表于 2019-1-28 17:31:28
84382
哪位高手能帮我看看我的对一个序列的求和为什么会错。我数据的长度就只能是2的倍数。思路就是两个两个求和,最后变成一个数。


#include <stdlib.h>
#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>


#define checkCudaErrors(call) \
{ \
const cudaError_t error = call; \
if (error != cudaSuccess) \
{ \
fprintf(stderr, "Error: %s:%d, ", __FILE__, __LINE__); \
fprintf(stderr, "code: %d, reason: %s\n", error, \
cudaGetErrorString(error)); \
exit(1); \
} \
}


const int N = 256;
const int TPB = 32;


__global__ void sumTest(int* data_In)
{
int tid = threadIdx.x+blockIdx.x * blockDim.x;
int i=N/2;
while(i!=0)
{
if(tid<i)
{
data_In[tid]+=data_In[tid+i];
}
__syncthreads();
i/=2;
}
if(tid ==0)
{
printf("the kernel result is %d\n",data_In[0]);
}

}
int main(int argc,char **argv)
{
printf("%s Starting \n",argv[0]);
//set up device
int dev = 0;
cudaDeviceProp deviceProp;
checkCudaErrors(cudaGetDeviceProperties(&deviceProp,dev));
printf("using Device %d: %s\n",dev,deviceProp.name);
checkCudaErrors(cudaSetDevice(dev));


//prepare for data
int* data_host;
int* data_dev;
int data_out;
data_host = (int*)malloc(sizeof(int)*N);
for(int i=0;i<N;i++)
{
data_host=i;
}

dim3 blockNum(TPB);
dim3 gridNum((N+TPB-1)/TPB);
checkCudaErrors(cudaMalloc(&data_dev,sizeof(int)*N));
checkCudaErrors(cudaMemcpy(data_dev,data_host,sizeof(int)*N,cudaMemcpyHostToDevice));
sumTest<<<gridNum,blockNum>>>(data_dev);
checkCudaErrors(cudaMemcpy(&data_out,&data_dev[0],sizeof(int),cudaMemcpyDeviceToHost));
printf("the gpu result is %d\n",data_out);

//print cpuResult
int out=0;
for(int i=0;i<N;i++)
{
out+=data_host;
}
printf("the cpu result is %d\n",out);
free(data_host);
checkCudaErrors(cudaFree(data_dev));


return 0;
}
结果:为什么每次GPU每次计算的结果还不一样,我也没有设置随机数什么的,初始化什么的也没问题吧?

使用道具 举报 回复
发表于 2019-1-28 21:04:45
你的代码完整吗?
使用道具 举报 回复 支持 反对
发表于 2019-1-31 11:48:22
nvadmin 发表于 2019-1-28 21:04
你的代码完整吗?

完整的,我已经知道我的错误原因了。
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册

zzczczxczxczx