CUDA重叠数据不工作

CUDA重叠数据不工作,cuda,overlapping,cuda-streams,Cuda,Overlapping,Cuda Streams,在我的系统中,使用蒸汽将数据传输与内核执行重叠是不起作用的 你好 我想在CUDA中使用重叠计算和数据传输,但我不能。 NVIDIA帮助文档说,如果使用流,则可以进行重叠计算和数据传输。 但我的系统一直不起作用 请帮帮我 我的系统在下面 操作系统:windows7 64位 CUDA:5.0.7版 开发工具包:视觉研究2008 GPU:GTX680 我得到的剖面图是这样的 我没有重复,代码如下: -new pinned memory cudaHostAlloc((voi

在我的系统中,使用蒸汽将数据传输与内核执行重叠是不起作用的

你好 我想在CUDA中使用重叠计算和数据传输,但我不能。 NVIDIA帮助文档说,如果使用流,则可以进行重叠计算和数据传输。 但我的系统一直不起作用 请帮帮我

我的系统在下面

  • 操作系统:windows7 64位
  • CUDA:5.0.7版
  • 开发工具包:视觉研究2008
  • GPU:GTX680
我得到的剖面图是这样的

我没有重复,代码如下:

    -new pinned memory 
        cudaHostAlloc((void **)&apBuffer, sizeof(BYTE)*lBufferSize,cudaHostAllocDefault);
    -call function

   //Input Data
    for(int i=0;i<m_n3DChannelCnt*m_nBucket;++i)
    {
        cudaErrorChk_Return(cudaMemcpyAsync(d_ppbImg[i],ppbImg[i],sizeof(BYTE)*m_nImgWidth*m_nImgHeight,cudaMemcpyHostToDevice,m_pStream[i/m_nBucket]));
    }
   //Call Function
    for(int i=0;i<m_n3DChannelCnt ;++i)
    {KernelGetVis8uObjPhsPhs<<<nBlockCnt,nThreadCnt,0,m_pStream[i]>>>(d_ppbVis[i],d_ppbAvg[i],d_ppfPhs[i],d_ppfObj[i],d_ppbAmp[i]
                                            ,nTotalSize,d_ppstRefData[i],d_ppbImg[i*m_nBucket],d_ppbImg[i*m_nBucket+1],d_ppbImg[i*m_nBucket+2],d_ppbImg[i*m_nBucket+3]
                                            ,fSclFloatVis2ByteVis);

    }
   //OutputData
    for(int i=0;i<m_n3DChannelCnt;++i)
    {
        if(ppbVis && ppbVis[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppbVis[i],d_ppbVis[i],sizeof(BYTE)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));
        if(ppbAvg && ppbAvg[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppbAvg[i],d_ppbAvg[i],sizeof(BYTE)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));
        if(ppfPhs && ppfPhs[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppfPhs[i],d_ppfPhs[i],sizeof(float)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));
        if(ppfObj && ppfObj[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppfObj[i],d_ppfObj[i],sizeof(float)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));
        if(ppbAmp && ppbAmp[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppbAmp[i],d_ppbAmp[i],sizeof(BYTE)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));

    }
-新的固定内存
cudaHostAlloc((void**)和apBuffer,sizeof(BYTE)*lBufferSize,cudaHostAllocDefault);
-调用函数
//输入数据

对于(int i=0;i您需要调用
cudaMemcpyAsync()
并以正确的顺序启动内核。在compute capability 3.5之前,只有一个队列用于调用设备端操作,并且它们不会被重新排序。将“调用函数”和“输出数据”阶段组合为

//Call Function and OutputData
for(int i=0;i<m_n3DChannelCnt ;++i)
{KernelGetVis8uObjPhsPhs<<<nBlockCnt,nThreadCnt,0,m_pStream[i]>>>(d_ppbVis[i],d_ppbAvg[i],d_ppfPhs[i],d_ppfObj[i],d_ppbAmp[i]
                                        ,nTotalSize,d_ppstRefData[i],d_ppbImg[i*m_nBucket],d_ppbImg[i*m_nBucket+1],d_ppbImg[i*m_nBucket+2],d_ppbImg[i*m_nBucket+3]
                                        ,fSclFloatVis2ByteVis);

    if(ppbVis && ppbVis[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppbVis[i],d_ppbVis[i],sizeof(BYTE)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));
    if(ppbAvg && ppbAvg[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppbAvg[i],d_ppbAvg[i],sizeof(BYTE)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));
    if(ppfPhs && ppfPhs[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppfPhs[i],d_ppfPhs[i],sizeof(float)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));
    if(ppfObj && ppfObj[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppfObj[i],d_ppfObj[i],sizeof(float)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));
    if(ppbAmp && ppbAmp[i]) cudaErrorChk_Return(cudaMemcpyAsync(ppbAmp[i],d_ppbAmp[i],sizeof(BYTE)*m_nImgWidth*m_nImgHeight,cudaMemcpyDeviceToHost,m_pStream[i]));

}
//调用函数并输出数据

对于(int i=0;i您可能需要检查您的代码在LINUX中是否按预期工作(即重叠)。我刚刚遇到了相同的问题,并发现WINDOWS可能存在一些问题(NVIDIA的驱动程序或WINDOWS本身),这些问题会干扰CUDA流中的重叠

您可以尝试检查SDK中的“simpleStreams”示例是否在您的计算机中使用重叠。就我而言,在Windows上运行的“simpleStream”完全没有重叠,但它在Linux中运行得非常好。具体而言,我在Fermi GTX570上使用的是CUDA 5.0+VS2010

TL;DR:问题是由Nsight Monitor中的WDDM TDR延迟选项引起的!如果设置为false,则会出现问题。相反,如果您将 TDR延迟值设置为非常高的数字,“启用”选项设置为 没错,这个问题消失了

阅读下面的其他(旧的)步骤,直到我找到上面的解决方案,以及一些其他可能的原因

我最近基本上解决了这个问题!我认为这是针对windows和aero的。请尝试这些步骤并发布您的结果以帮助其他人!我已经在GTX 650和GT 640上试用过

<强>在你做任何事情之前,考虑一下,因为英伟达驱动程序已经为Windows提供了验证问题。当你使用车载GPU时,所说的驱动程序没有被完全加载,所以很多错误被回避。同时,系统响应性在工作时保持不变。>/P>

  • 确保您的并发问题与其他问题无关,如旧的驱动程序(包括bios版本)、错误的代码、无法使用的设备等
  • 转到计算机>属性
  • 选择左侧的高级系统设置
  • 转到“高级”选项卡
  • 在性能上单击“设置”
  • 在“视觉效果”选项卡中,选择“调整以获得最佳性能”项目符号
  • 这将禁用aero和几乎所有的视觉效果。如果此配置有效,您可以尝试逐个启用视觉效果框,直到找到导致问题的精确框

    或者,您可以:

  • 右键单击桌面,选择个性化设置
  • 从基本主题中选择一个没有aero的主题
  • 这也可以像上面一样工作,但是启用了更多的视觉选项。对于我的两台设备,这个设置也可以工作,所以我保留了它

    请,当您尝试这些解决方案时,回到这里并发布您的发现

    对我来说,它解决了大多数情况下的问题(我制作的平铺dgemm),但请注意我仍然无法正确运行“simpleStreams”并实现并发性…

    更新:通过新的windows安装,问题得到了完全解决!!之前的步骤改善了某些情况下的行为,但新的安装解决了所有问题

    我将尝试找到一种不太激进的方法来解决这个问题,也许只恢复注册表就足够了。

    请更多地注意在堆栈溢出问题中使用的格式和语言。在您发布时,这几乎是一团混乱。