【问题标题】:CUDA PTX, driver api - how to get global variable from kernel after executionCUDA PTX,驱动程序 api - 执行后如何从内核获取全局变量
【发布时间】:2016-01-23 19:18:20
【问题描述】:

这是内核代码的一部分 - 为每个线程声明变量和所需的操作

.global.f32 sum = 0.0
.reg.f32 reg;
atom.global.add.f32 reg, [sum], val;

我想将每个线程中的不同变量添加到全局变量 sum。 我假设上面发布的代码是正确的 - 一切都顺利编译。但是我无法将全局变量 sum 的值返回给主机。

内核执行后,我有以下主机代码。

CUdeviceptr hostSumPtr;
size_t bytes;
cuModuleGetGlobal(&hostSumPtr, &bytes, hModule, "sum");

但返回错误代码 500“CUDA_ERROR_NOT_FOUND”

有什么方法可以将内核中声明的全局变量的值传递给主机,或者有什么方法可以通过不同的方法绕过这个问题?

【问题讨论】:

  • 您在 PTX 中声明了 sum 的什么范围?它是在内核内部还是在编译单元范围内。我认为只支持后者。
  • 我在开始 { 括号后立即声明了它。 - 误会见谅
  • 显然您在 PTX 中声明了它。但我问的是 PTX 中的 哪里?我们在内核里面声明我们在外面呢?
  • 我在开始 { 括号后立即声明了它。我应该在内核函数声明之前声明它吗?
  • 是的,我相信是的。如果您发布了有人可以分析的更完整的代码,那就容易多了。在 cmets 中玩猜谜游戏并不好玩

标签: c++ c cuda ptx


【解决方案1】:

有 3 个问题:

  1. 应在内核范围之外声明全局变量。
  2. 架构必须设置为 sm_30 及以上(这只适用于这种特殊情况,未显示详细信息)
  3. 内核版本必须设置为 3.0 及以上(这也仅适用于这种特殊情况,问题中未显示详细信息)

问题已解决。

【讨论】:

  • 我对此进行了编辑,以注意最后两个是特定于您的 GPU 和构建设置的实现细节。它们与驱动程序或运行时 API 的 PTX 全局符号可访问性无关
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2013-03-28
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多