CUDA程序,每次运行结果略有不同

CUDA程序,每次运行结果略有不同,cuda,neural-network,opencl,Cuda,Neural Network,Opencl,我是CUDA和OpenCL的新手 我已经将一个程序的内核从CUDA内核翻译成OpenCL内核。我在两个版本中使用相同的种子生成随机数。 虽然OpenCL版本每次运行的结果完全相同,但CUDA版本每次运行的结果略有不同。 我编译的CUDA版本没有-使用\u fast\u math。 我的设备具有1.1的功能。 你知道原因是什么吗 提前感谢compute capability 1.1的设备不支持双重操作。因此,如果您使用的是double,它们将降级为float。这可能会影响您的结果,尽管comput

我是CUDA和OpenCL的新手

我已经将一个程序的内核从CUDA内核翻译成OpenCL内核。我在两个版本中使用相同的种子生成随机数。 虽然OpenCL版本每次运行的结果完全相同,但CUDA版本每次运行的结果略有不同。 我编译的CUDA版本没有
-使用\u fast\u math
。 我的设备具有1.1的功能。 你知道原因是什么吗


提前感谢compute capability 1.1的设备不支持双重操作。因此,如果您使用的是
double
,它们将降级为
float
。这可能会影响您的结果,尽管compute capability 1.1设备也不能在OpenCL中支持
double
,AFAIK

我的问题是,是否存在任何可能影响CUDA结果准确性的CUDA编译选项

是的,有多种选择会影响CUDA的使用


然而,我不知道为什么这些都会导致从一次跑步到下一次跑步的变化。很可能代码中有错误。

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

这不意味着您的OpenCL版本不正确吗?我认为,您的问题中没有足够的信息来做出任何有根据的陈述。您能否提供一个简短、完整的可编译代码来演示这个问题?(一个完整的代码,我可以复制、粘贴和编译,而无需添加或编辑任何内容。)您在所有CUDAAPI调用和内核调用上都做了什么?您是否使用
cudamemcheck
运行代码以查找内核中的越界访问或其他问题?实际上,我正在实现人工神经网络。很难提供所有代码。OpenCL版本似乎工作正常,最终权重始终与我从固定种子开始时相同。CUDA版本给出了稍微不同的结果。我的问题是,是否有任何CUDA编译选项可能会影响CUDA结果的准确性。请将代码缩短到可以重现问题的长度。通常情况下,当人们创建一个问题时,他们会自己发现问题。你还没有回答我关于cuda错误检查或cuda-memcheck的问题。实际上,我使用的是浮点运算,而不是双精度运算。我的opencl版本是cuda内核的精确翻译。CUDA版本是原始版本。翻译(opencl版本)如何能正确工作,而原始代码(cuda)却不能。我猜这是因为我的cuda编译。@JamesStewart:你真的在问为什么你没有写并且没有显示的代码(在你看来)在你将代码翻译到OpenCL时不能正常工作(同样在你看来)是否正确工作?我是问编译选项对结果准确性的影响。编译器选项不应导致每次运行CUDA代码时结果发生变化。它们可能会导致CUDA和OpenCL结果之间的差异,但差异应该始终相同。我的第一个嫌疑犯是越界内存访问。旧的CUDA设备无法捕获全局内存中的这些数据,因此可能会出现错误的结果。其次,硬件故障的可能性较小。尝试cuda memcheck,如果您怀疑硬件问题,也可以尝试gpu刻录。