我有一个简单的nbody实现代码,并尝试编译它以在NVIDIA GPU(Tesla K20m / Geforce GTX 650 Ti)上启动。我使用以下编译器选项:
-Minfo=all -acc -Minline -Mfpapprox -ta=tesla:cc35/nvidia
一切都没有-Mfpapprox
,但是当我使用它时,编译失败并带有以下输出:
346, Accelerator restriction: unsupported operation: RSQRTSS
346行写道:
float rdistance=1.0f/sqrtf(drSquared);
,其中
float drSquared=dx*dx+dy*dy+dz*dz+softening;
和dx
,dy
,dz
是浮点值。这一行在#pragma acc并行循环内部独立于()构造。
-Mfpapprox
有什么问题?
答案 0 :(得分:0)
-Mfpapprox告诉编译器使用非常低精度的CPU指令来近似DIV或SQRT。 GPU不支持这些说明。 GPU SQRT既快速又精确,因此无需低精度版本。
实际上即使在CPU上,我建议你不要使用-Mfpapprox,除非你真正理解你的代码的数学,它可以处理高度不精确(多达5-6位或~20Ulps关闭)。我们在大约10年前添加了这个标志,因为在CPU分配操作时非常昂贵。但是,从那时起,div的CPU性能已经大大提高(就像sqrt一样)所以你通常最好不要牺牲精度,因为你可以从这个标志中获得一点点加速。
我会发出一个问题报告,要求编译器忽略-Mfpapprox for GPU代码,这样你就不会看到这个错误了。