Floating point 浮点数的金属SIMD最小和最大操作失败

Floating point 浮点数的金属SIMD最小和最大操作失败,floating-point,gpgpu,simd,metal,compute-shader,Floating Point,Gpgpu,Simd,Metal,Compute Shader,简言之,问题 为什么我会从Metal 2.1中带有浮点数的simd_min和simd_max函数中获得未定义的行为 更新:这似乎只发生在Radeon Pro 560X GPU上,而不是在Intel UHD Graphics 630上 背景 根据第5.14节的规定,simd_min和simd_max函数支持普通标量或向量、整数或浮点类型 对于simd_max,规范规定: T simd\u max(T数据) 返回所有数据中的最大值 SIMD组中的活动线程和 将结果广播到中的所有活动线程 SIMD小组

简言之,问题

为什么我会从Metal 2.1中带有浮点数的
simd_min
simd_max
函数中获得未定义的行为

更新:这似乎只发生在Radeon Pro 560X GPU上,而不是在Intel UHD Graphics 630上

背景

根据第5.14节的规定,
simd_min
simd_max
函数支持普通标量或向量、整数或浮点类型

对于
simd_max
,规范规定:

T simd\u max(T数据)

返回所有数据中的最大值 SIMD组中的活动线程和 将结果广播到中的所有活动线程 SIMD小组

测试用例

为了测试这一点,我正在使用范围为0..100的128个随机浮点的输入缓冲区执行以下测试内核:

kernel void simdMaxDebugKernel(
                          const device float *buffer [[ buffer(0) ]],
                          device float *output [[ buffer(1) ]],
                          uint id [[ thread_position_in_grid ]])
{
    output[id] = simd_max(buffer[id]);
}
通过检查,128值缓冲区分为两个64值SIMD组。因此,我希望输出中的第一个和最后64个值将分别设置为第一个和最后一个SIMD组的最大值

测试结果

我得到了一些意想不到的结果:

inputs  [simd_float1]   128 values  
[0] Float   94.3006362
[1] Float   98.1107177
[2] Float   85.3725891
[3] Float   45.1457863
...
[63] Float  36.5486336
[64] Float  56.5494308
[65] Float  45.6249847
[66] Float  34.8077431

actual  [simd_float1]   128 values  
[0] Float   94.3006362
[1] Float   NaN
[2] Float   -3.80461845E+20
[3] Float   0.0000000000000000000000000000000000000212763294
...
[63] Float  0
[64] Float  56.5494308
[65] Float  -2467.3457
[66] Float  0.0000000000010178117
...

expectedMax simd_float1 99.4676971
在我看来,每个SIMD组的第一个SIMD通道上的值只是复制的,其余的未定义

相反,如果按照如下方式使用到
uint
的转换,内核的行为与预期相同:

output[id] = (float)simd_max((uint)buffer[id]);

测试配置

  • Mac OS 10.14.2(18C54)
  • MacBook Pro(15英寸,2018年)
  • Radeon Pro 560X 4096 MB
  • XCode版本10.1(10B61)

您是否在英特尔GPU上尝试过此功能,以查看其性能是否相同?@IDoology,很好。现在已试用过,尽管Intel上的simd组大小为32,但使用simd_最小值或simd_最大值的Intel GPU似乎没有问题。因此,硬件依赖于此功能。我想知道是否有可能将其链接到GPU规范,以查看支持哪些GPU?这听起来像是一个合法的AMD驱动程序/编译器错误。请你提交一份错误报告,并在这里张贴错误编号,以便我可以跟进。在AMD上提交了一份驱动程序缺陷报告。但没有得到缺陷id。
actual  [simd_float1]   128 values  
[0] Float   99
[1] Float   99
[2] Float   99
...
[63] Float  99
[64] Float  96
[65] Float  96
...