【问题标题】:CUDA program with slight different results every runCUDA 程序每次运行的结果略有不同
【发布时间】:2016-03-10 08:36:31
【问题描述】:

我是 CUDA 和 OpenCL 的新手。

我已经将一个程序的内核从 CUDA 内核翻译成 OpenCL 内核。我在两个版本中都使用相同的种子来生成随机数。 虽然 OpenCL 版本每次运行都得到完全相同的结果,但 CUDA 版本每次运行时给出的结果略有不同。 我正在编译没有-use_fast_math 的CUDA 版本。 我的设备是 1.1 功能。 知道可能是什么原因吗?

提前致谢

【问题讨论】:

  • 不是说你的OpenCL版本不对吗?
  • 在我看来,您的问题中没有足够的信息来做出任何有根据的陈述。您能否提供一个简短、完整的可编译代码来演示该问题? (我可以复制、粘贴和编译的完整代码,无需添加或编辑任何内容。)您是否对所有 cuda API 调用和内核调用执行cuda error checking?您是否使用cuda-memcheck 运行代码以查找内核中的越界访问或其他问题?
  • 实际上,我正在实施人工神经网络。很难提供所有代码。
  • OpenCL 版本似乎工作正常,最终权重始终与我从固定种子开始时相同。 CUDA 版本给出的结果略有不同。我的问题实际上是是否有任何可能影响 CUDA 结果准确性的 CUDA 编译选项。
  • 将代码缩减为能够重现问题的简短代码。通常,当人们创建reproducer 时,他们会自己发现问题。你也没有回答我关于 cuda 错误检查或 cuda-memcheck 的问题。

标签: cuda neural-network opencl


【解决方案1】:

计算能力 1.1 的设备不支持 double 操作。因此,如果您使用double,他们将被降级为float。这可能会影响您的结果,尽管计算能力 1.1 的设备也不支持 OpenCL 中的double,AFAIK。

我的问题实际上是是否有任何 CUDA 编译选项可能会影响 CUDA 结果的准确性。

是的,有多种选项会影响 CUDA 的使用 of floating point math

但是,我不知道为什么这会导致从一个运行到下一个运行的变化。你的代码很可能有错误。

【讨论】:

  • 其实我用的是float,不是double操作。
  • 我的 opencl 版本是 cuda 内核的精确翻译。 CUDA 版本是原始版本。翻译(opencl 版本)如何正确工作,而原始代码(cuda)不能。我的猜测是因为我的 cuda 编译。
  • @JamesStewart:您是否真的在问为什么当您将代码翻译成 OpenCL 时(再次在您看来) 是否可以正常工作?
  • 我在问编译选项对结果准确性的影响。
  • 编译器选项不应导致每次运行 CUDA 代码时结果都不同。它们可能会导致您的 CUDA 和 OpenCL 结果之间存在差异,但差异应该始终相同。我的第一个嫌疑人是越界内存访问。旧的 CUDA 设备没有为全局内存捕获这些,因此可能会出现错误的结果。其次,但不太可能是硬件故障。试试 cuda-memcheck 或者 gpu-burn - link - 如果你怀疑有硬件问题。
【解决方案2】:

我发现了问题。在原始代码中,一些值是异步更新的,还没有完全更新。谢谢大家的帮助。并且很抱歉给您带来麻烦。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2016-10-28
    • 2012-05-02
    相关资源
    最近更新 更多