【问题标题】:CUDA: same code different results on Quadro 3000M and Tesla C1060CUDA:Quadro 3000M 和 Tesla C1060 上相同的代码不同的结果
【发布时间】:2013-01-17 14:56:31
【问题描述】:

以下链接指向的代码适用于 Tesla C1060,但不适用于配备 Quadro 3000M 的移动工作站。

这主要是代码的作用:

http://pastebin.com/9JKUMwZ4

Quadro 3000M 上的执行只是跳过内核并在几毫秒内输出一个空白图像。 Tesla C1060 上的执行在(比如说)100 秒内输出处理后的图像。奇怪的是,在过去的几天里,c1060 上的执行也显得相当不可预测(有时会跳过内核,有时会输出奇怪的数字为 -10^12,..)。我不明白这种行为。 会不会是驱动版本问题?

提前感谢您的帮助。

ps。 ubuntu 11.10 上的两台机器

Quadro 3000M  ---> Cuda compilation tools, release 4.1, V0.2.1221
Tesla C1060   ---> Cuda compilation tools, release 4.1, V0.2.1221

编辑:问题很可能与我的 2 张卡的不同 GPU 架构有关。

【问题讨论】:

  • Q3000m 通常有 2GB,C1060 有更多。你分配了多少 GPU 内存?您还应该对内核调用进行错误检查。您是否在 Q3000M 上运行 X?
  • 1)cudaMemGetInfo(&f, &t) 在内核给出 free=1727807488, total= 2147024896 之前。 2) 如果我放置一些 errorChecks 我得到错误@line 75 : CUDA Runtime API error 4: unspecified发射失败。 3) 是的,我正在运行 X,我将尝试在禁用 X 的情况下运行代码。谢谢
  • Quadro 3000M 是费米部件。与基于 GT200 的 C1060 相比,它改进了内存保护。您的代码很可能在某处有越界访问,导致代码在 Fermi 设备上失败。尝试使用 cuda-memcheck 运行您的代码并查看它报告的内容。
  • 我确实得到了未对齐的地址pastebin.com/VF4YeKvA。奇怪的是,这段代码在不同的 GPU 代中的工作方式不同,我想我应该将注意力集中在我访问 *src 的内核代码(第 33 行)pastebin.com/E60Rvu9j

标签: cuda gpu gpgpu


【解决方案1】:

__syncthreads()if 语句中。这是不允许的,可能会导致死锁。

请参阅__syncthreads() Deadlock 帖子。

Cuda-memcheck 和调试器是调查此类和其他问题的最佳工具。

【讨论】:

  • 我注释掉了 __syncthreads() 但不幸的是它不起作用。正如您还建议的那样,我运行 cuda-memcheck 并获得了 pastebin.com/VF4YeKvA。正如我在上一条评论中所指出的,问题在于 *src 访问。对于如何在不同的 GPU 代中继续并确保此代码安全,您有什么建议吗?
  • 您的内核访问的指针未正确对齐您读取的变量大小。看看:stackoverflow.com/a/11832846/56875要么对齐指针,要么读取 1 个字节。请同时包含 gpuContrastKernel2 的来源
  • 这里是内核pastebin.com/RVpEjzNS。感谢您的建议,现在我专注于指针并让您知道。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多