ZeroCopy的问题。

为什么用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]); 

请高手指点。

kernel launch是异步的
所以kernel后要做主机与设备间的同步才能让主机端安全的访问已经被设备端改写的数据

同步后还是同样的问题。

是否有这个来进行同步处理? cudaThreadSynchronize()

好了问题解决了,要在两个内核后面都加上同步处理的函数cudaThreadSynchronize(),否则主机与设备端会不同步,谢谢樟树大哥点播。。