0

在下面的测试代码中,我们通过 GPU 初始化数据,然后通过 CPU 访问数据。我对 nvprof 的分析结果有 2 个问题。

  • 为什么会有一个数据从主机迁移到设备?据我了解,它应该是设备到主机。

  • 为什么 H->D 计数为 2?我认为它应该是 1,因为数据在一页中。

提前致谢!

我的环境

  • 驱动程序版本:418.87.00
  • CUDA 版本:10.1
  • Ubuntu 18.04
#include <cuda.h>
#include <iostream>

using namespace std;

__global__ void setVal(char* data, int idx)
{
    data[idx] = 'd';
}


int main()
{
    const int count =  8;

    char* data;
    cudaMallocManaged((void **)&data, count);

    setVal<<<1,1>>>(data, 0); //GPU page fault

    cout<<" cpu read " << data[0] <<endl; 
  
    cudaFree(data);

    return 0;
}
==28762== Unified Memory profiling result:
Device "GeForce GTX 1070 (0)"
   Count  Avg Size  Min Size  Max Size  Total Size  Total Time  Name
       2  32.000KB  4.0000KB  60.000KB  64.00000KB  11.74400us  Host To Device
       1         -         -         -           -  362.9440us  Gpu page fault groups
Total CPU Page faults: 1
4

1 回答 1

2

为什么会有一个数据从主机迁移到设备?据我了解,它应该是设备到主机。

您正在主机和设备之间颠簸数据。因为 GPU 内核启动是异步的,所以在内核启动之后发布的主机代码实际上是在 GPU 代码之前访问数据。

在内核调用之后放置一个,以便 CPU 代码内核完成cudaDeviceSynchronize()之前不会尝试读取数据。

对于你的另一个问题,我没有答案。探查器通常无法完美解析非常少量的活动。它不一定会在分析运行期间检测所有 SM,并且它的一些结果可能会针对 GPC、TPC 和/或整个 GPU 的大小进行缩放。这将是我的猜测,尽管这只是猜测。在分析几乎什么都不做的微小代码时,我通常不期望分析器提供完全准确的结果。

于 2020-08-18T13:47:54.253 回答