【问题标题】:CUDA GPU __global__ function does not completeCUDA GPU __global__ 功能未完成
【发布时间】:2021-04-23 16:39:56
【问题描述】:
__global__ void functionA()
{
 printf("functionA");
}

int main()
{
  printf("main1");
  functionA<<<1,1>>>();
  printf("main2");
}

我正在尝试使用上述内容运行一个简单的测试。但程序只输出“main1”。程序也应该输出“functionA”和“main2”。

【问题讨论】:

  • GPU 代码可以“打印”吗?我不认为 GPU 核心可以访问控制台(我认为它们是单独的核心,无法访问世界其他地方)。
  • @ThomasMatthews 您可以从 CUDA GPU 代码打印

标签: c++ cuda gpu


【解决方案1】:

这似乎有两个原因:

  • 首先你需要添加

    cudaDeviceSynchronize();
    

    在 CUDA 例程之后为了阻塞 main 直到设备完成所有任务

  • 此外,如果您在编译代码时设置了错误的 GPU 架构/计算能力XX

    ,则可能会发生这种情况
    $ nvcc -gencode=arch=compute_XX,code=sm_XX -o my_app my_app.cu
    

    在这种情况下,只运行主机代码,而加速器上的部分似乎会被省略。您可以在here 上找到不同硬件代的相应编号XX 的概述。您正在运行的 K20m 是35。所以应该是

    $ nvcc -gencode=arch=compute_35,code=sm_35 -o my_app my_app.cu
    

    在你的情况下。

    如果您的系统中有多个图形加速器并且代码在错误的一个上执行,也可能会发生这种情况。每个图形卡/加速器都分配有一个特定的设备 ID。编号为0 的设备应自动分配给功能最强大的设备,并将默认使用。因此,我第一次在包含强大的 Tesla K80(架构 37)和低功耗 Quadro P620(架构 60)的系统上编译代码时,我选择了 37,并且在选择时遇到了与您相同的错误60 代码将运行。然后我使用 Querying Device Properties example 给我一个支持 CUDA 的设备及其相应设备 ID 的列表,只是为了发现在我的系统上 Tesla K80 设置为 12 而简单Quadro P620显卡设置为0。我认为是这种情况,因为 K80 在 CUDA 11 中已弃用!

    您可以使用cudaSetDevicechange it when launching the program with 在代码中选择设备

    $ CUDA_VISIBLE_DEVICES="1" ./my_app
    

    其中1 必须替换为您希望使用的设备ID。这样做应该可以让您的代码毫无问题地运行。

您还可以通过克隆Github repository of "Learn CUDA Programming",然后浏览Chapter01/01_cuda_introduction/01_hello_world/,使用$ make 编译make 文件,最后使用$ ./hello_world 运行它来测试这是否真的是问题所在。它会针对多种架构/计算功能自动编译,因此应该可以毫无问题地运行!

【讨论】:

  • 感谢您的解释;我取得了一些进展。但是,在functionA&lt;&lt;&lt;1,1&gt;&gt;&gt;();下方添加cudaDeviceSynchronize();并执行CUDA_VISIBLE_DEVICES="1" ./my_app后,程序只输出“main1”和“main2”。看来 functionA() 的 printf 没有被执行。
  • @ThomasContreras 你能运行上面链接的查询设备属性示例并告诉我它检测到哪些设备吗?然后我可以告诉你必须为你的 GPU 设置哪种计算架构。
  • 此外,您可以尝试底部的 Github 存储库,以检查这是否真的适用于您的开箱即用设置。
  • 它检测到 Tesla K20m。如果您需要更多信息,请告诉我。我去看看 Github。
  • @ThomasContreras Tesla K20m 有哪个 id? K20m 的计算能力为 35。
猜你喜欢
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多