Concurrency CUDA并发执行问题

Concurrency CUDA并发执行问题,concurrency,cuda,Concurrency,Cuda,我想创建一个基本的CUDA应用程序,为学生演示内存传输/内核执行重叠。 但是使用nvvp,似乎没有并发执行。你能帮我出什么事了吗 完整来源(Visual Studio 2015、CUDA 8.0、sm3.5、arch3.5、Titan X卡): #包括“cuda_runtime.h” #包括“设备启动参数.h” #包括 #包括 #定义MEMSIZE 8000000 #定义流\u N 8 __全局无效测试内核(char*img) { int pos=blockIdx.x*blockDim.x+th

我想创建一个基本的CUDA应用程序,为学生演示内存传输/内核执行重叠。 但是使用nvvp,似乎没有并发执行。你能帮我出什么事了吗

完整来源(Visual Studio 2015、CUDA 8.0、sm3.5、arch3.5、Titan X卡):

#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
#包括
#定义MEMSIZE 8000000
#定义流\u N 8
__全局无效测试内核(char*img)
{
int pos=blockIdx.x*blockDim.x+threadIdx.x;
对于(int k=0;k<100;k++)
img[pos]=img[pos]/2+128;
}
int main()
{
//分配内存和流
char*img[STREAM_N];
char*d_img[STREAM_N];
cudaStream_t streams[STREAM_N];
for(int-pi=0;pi(d_img[pi]);
for(int-pi=0;pi(d_img[pi]);
cudaMemcpyAsync(img[pi]、d_img[pi]、MEMSIZE/STREAM\N、cudaMemcpyDeviceToHost、streams[pi]);
}
cudaDeviceSynchronize();
//销毁流并释放内存
for(int-pi=0;pi
和可视化探查器输出:


WDDM命令批处理导致了该问题。 最好的解决方案是将卡的工作模式从WDDM切换到TCC。这可以通过nvidia smi命令完成

nvidia-smi -i <gpu_id> -dm 1
英伟达smi-i-dm 1
这解决了我的问题。我想看到的模式是:

另一种解决方案是使用cudaStreamQuery()手动刷新命令队列,如:

for(int-pi=0;pi(d_img[pi]);
cudaMemcpyAsync(img[pi]、d_img[pi]、MEMSIZE/STREAM\N、cudaMemcpyDeviceToHost、streams[pi]);
cudaStreamQuery(streams[pi]);//刷新命令队列
}

WDDM命令批处理导致了该问题。 最好的解决方案是将卡的工作模式从WDDM切换到TCC。这可以通过nvidia smi命令完成

nvidia-smi -i <gpu_id> -dm 1
英伟达smi-i-dm 1 这解决了我的问题。我想看到的模式是:

另一种解决方案是使用cudaStreamQuery()手动刷新命令队列,如:

for(int-pi=0;pi(d_img[pi]);
cudaMemcpyAsync(img[pi]、d_img[pi]、MEMSIZE/STREAM\N、cudaMemcpyDeviceToHost、streams[pi]);
cudaStreamQuery(streams[pi]);//刷新命令队列
}

谢谢,我已经阅读了这个问题,但它对我没有帮助。其中一个解决方案与我的代码非常相似(但使用多个GPU)。但在我的例子中,您认为是什么阻止了并发执行?您希望或希望看到什么样的并发?CUDA体系结构中有4种典型的执行“类型”,它们可能重叠:1。CPU活动2。GPU活动3。D->H传输4。H->D传输。你可能会明确你在寻找哪些重叠:2+2?2+3? 2+4? 其他人?每种情况都有单独的规则和要求。您肯定不会看到2+2与您的代码重叠,因为每次内核启动都会启动2500个块,这有效地防止了内核与其他内核的并发执行。您可能还希望学习CUDA并发内核示例代码,因为它演示了许多必要和有用的概念。WDDM命令批处理可能会妨碍您。由于您有一张泰坦卡,您可以尝试将其置于TCC模式而不是WDDM模式。或者,在linux上运行代码。当我在linux上运行代码时,我看到复制操作与计算操作重叠。是我在
nvvp
中看到的。另外请注意,泰坦X不是一张sm_35卡。谢谢,我已经阅读了这个问题,但它对我没有帮助。其中一个解决方案与我的代码非常相似(但使用多个GPU)。但在我的例子中,您认为是什么阻止了并发执行?您希望或希望看到什么样的并发?CUDA体系结构中有4种典型的执行“类型”,它们可能重叠:1。CPU活动2。GPU活动3。D->H传输4。H->D传输。你可能会明确你在寻找哪些重叠:2+2?2+3? 2+4? 其他人?每种情况都有单独的规则和要求。您肯定不会看到2+2与您的代码重叠,因为每次内核启动都会启动2500个块,这有效地防止了内核与其他内核的并发执行。您可能还希望学习CUDA并发内核示例代码,因为它演示了许多必要和有用的概念。WDDM命令批处理可能会妨碍您。由于您有一张泰坦卡,您可以尝试将其置于TCC模式而不是WDDM模式。或者,在linux上运行代码。当我在linux上运行代码时,我看到复制操作与计算操作重叠。
for (int pi = 0; pi < STREAM_N; pi++) 
    {
        cudaMemcpyAsync(d_img[pi], img[pi], MEMSIZE / STREAM_N, cudaMemcpyHostToDevice, streams[pi]);
        TestKernel <<< MEMSIZE / STREAM_N / 400, 400, 0, streams[pi] >>>(d_img[pi]);
        cudaMemcpyAsync(img[pi], d_img[pi], MEMSIZE / STREAM_N, cudaMemcpyDeviceToHost, streams[pi]);
        cudaStreamQuery(streams[pi]); // FLUSH COMMAND QUEUE
    }