为什么用ZeroCopy这个技术,第一次调用内核函数时可以正确赋值,在第二次调用内核函数时,数就不对了,这是为什么?大概代码是这样的
int *useMem,*cudaMem;
int *useMemTwo, *cudaMemTwo;
int bytes = sizeof(int) * 1024 * 1024;
cudaSetDeviceFlags(cudaDeviceMapHost);
flags = cudaHostAllocMapped;
cudaHostAlloc((void **)&useMem, bytes, flags);
cudaHostAlloc((void **)&useMemTwo, bytes, flags);
memcpy(useMem,buf,bytes); //buf是一个1024 * 1024的int数组,里面填满了从0~1024*1024的值。
cudaHostGetDevicePointer((void **)&cudaMem, (void *)useMem, 0);
cudaHostGetDevicePointer((void **)&cudaMemTwo,(void *)useMemTwo,0);
/*这里我是为了测试程序随便分了一个block,内核函数就是简单的,把cudaMem的值,赋给cudaMemTwo,然后就退出了*/
KernelFunctioin <<< 2,512 >>> ( cudaMem , cudaMemTwo );
for(int i = 0 ; i < 100 ; i++)
printf("%d ",cudaMemTwo[i]); //这里也是为了测试,就查看cudaMemTow前100个值是否以赋值过来
//上面这块都没问题,都是成功赋值过去,可是这时我把cudaMemTwo数组的值重新归位
memset(useMemTwo,0,bytes);
//在重新调用内核函数把cudaMem的值赋值给cudaMemTwo,就出现问题。有几个值没有赋值进去
KernelFunctioin <<< 2,512 >>> ( cudaMem , cudaMemTwo );
//这里的值就出问题了。
for(int i = 0 ; i < 100 ; i++)
printf("%d ",cudaMemTwo[i]);
请高手指点。