#define NSTREAMS 8 #define BLOCKDIMX 16 #define BLOCKDIMY 16 void domainupdate(float* domain_cpu,// pointer to domain on host float* domain_gpu,// pointer to domain on device const unsigned int dimX,const unsigned int dimY,const unsigned int dimz) { dim3 blocks((dimX + BLOCKDIMX - 1) / BLOCKDIMX,(dimY + BLOCKDIMY - 1) / BLOCKDIMY); dim3 threads(BLOCKDIMX,BLOCKDIMY); for (unsigned int ii = 0; ii < NSTREAMS; ++ii) { updateDomain3D<<<blocks,threads,streams[ii]>>>(domain_gpu,dimX,dimX - 1,// dimX,minX,maxX dimY,dimY - 1,// dimY,minY,maxY dimZ,dimZ * ii / NSTREAMS,dimZ * (ii + 1) / NSTREAMS - 1); // dimZ,minZ,maxZ unsigned int offset = dimX * dimY * dimZ * ii / NSTREAMS; cudaMemcpyAsync(domain_cpu + offset,domain_gpu+ offset,sizeof(float) * dimX * dimY * dimZ / NSTREAMS,cudaMemcpyDeviCEToHost,streams[ii]); } cudaDeviceSynchronize(); }
总而言之,它只是一个简单的for循环,循环遍历所有流(在本例中为8)并分割工作.这实际上是一个更快的交易(高达30%的性能提升),虽然可能比我希望的要少.我分析了Nvidia的Compute Visual Profiler中的典型循环,执行情况如下:
从图中可以看出,内核确实重叠,尽管同时运行的内核不会超过两个.我为不同@L_874_10@的流和模拟域的不同大小尝试了相同的事情,但总是如此.
所以我的问题是:有没有办法鼓励/强制GPU调度程序同时运行两个以上的东西?或者这是否取决于GPU设备无法在代码中表示?
我的系统规格是:64位Windows 7和GeForce GTX 670显卡(即Kepler架构,计算能力3.0).
以上是大佬教程为你收集整理的c – 改进CUDA中的异步执行全部内容,希望文章能够帮你解决c – 改进CUDA中的异步执行所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。