Floating point 两个GPU上不同的浮点矩阵乘法结果

Floating point 两个GPU上不同的浮点矩阵乘法结果,floating-point,gpu,metal,Floating Point,Gpu,Metal,我正在两个单独的GPU上运行一个来自Metal Performance Shader的MPSMatrixMultiplication,一个是内部GPU,一个是AMD GPU。矩阵是完全相同的 但问题是结果并不完全相同。我知道GPU有一些精度损失,但为什么结果与相同的IEEE 754-2008标准不一样 我想验证GPU计算的正确性。我怎么能这么做?我应该允许0.0001差异,这是每个结果之间的最大差异吗?金属编译器默认使用快速数学,这使GPU能够违反IEEE 754以提高性能。我想这就是你得到不同

我正在两个单独的GPU上运行一个来自Metal Performance Shader的
MPSMatrixMultiplication
,一个是内部GPU,一个是AMD GPU。矩阵是完全相同的

但问题是结果并不完全相同。我知道GPU有一些精度损失,但为什么结果与相同的IEEE 754-2008标准不一样


我想验证GPU计算的正确性。我怎么能这么做?我应该允许0.0001差异,这是每个结果之间的最大差异吗?

金属编译器默认使用
快速数学
,这使GPU能够违反IEEE 754以提高性能。我想这就是你得到不同结果的原因


您应该能够在项目的生成设置中禁用
fast math

这两个设备使用相同的浮点格式吗?它们都符合IEEE-754标准吗?执行矩阵乘法的进程是否以完全相同的顺序执行完全相同的操作?后者很可能并非如此。乘法可以分解为分配给可用处理器的子任务,分区可能会根据硬件特性而变化,结果的重组可能取决于不同处理器何时完成任务。变化的程度取决于矩阵的条件数(取决于数据)、使用的算法等。如果您想测试GPU计算,而不是测试特定矩阵的结果,则可以使用具有良好数值特性的准备好的简单矩阵。例如,您可以使用大多数元素为零和少数非零的矩阵(以及简单值,如小整数),然后使用不同的非零元素执行重复测试,在多组测试中测试整个乘法。我确实将MTL_FAST_MATH设置为“否”,但结果仍然不同……我使用的是32位浮点数,我猜测Intel GPU是否支持它。您是否尝试将选项
-fno FAST MATH
添加到t他没有设置标志,而是设置了MTL\U编译器标志(其他金属编译器标志)?我在建筑设置中没有看到该选项。我应该通过单击加号添加用户定义的设置吗?我尝试添加一个,但仍然不起作用。