加速器限制:不支持的操作:RSQRTSS

时间:2017-09-22 16:06:52

标签: openacc

我有一个简单的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;

dxdydz是浮点值。这一行在#pragma acc并行循环内部独立于()构造。 -Mfpapprox有什么问题?

1 个答案:

答案 0 :(得分:0)

-Mfpapprox告诉编译器使用非常低精度的CPU指令来近似DIV或SQRT。 GPU不支持这些说明。 GPU SQRT既快速又精确,因此无需低精度版本。

实际上即使在CPU上,我建议你不要使用-Mfpapprox,除非你真正理解你的代码的数学,它可以处理高度不精确(多达5-6位或~20Ulps关闭)。我们在大约10年前添加了这个标志,因为在CPU分配操作时非常昂贵。但是,从那时起,div的CPU性能已经大大提高(就像sqrt一样)所以你通常最好不要牺牲精度,因为你可以从这个标志中获得一点点加速。

我会发出一个问题报告,要求编译器忽略-Mfpapprox for GPU代码,这样你就不会看到这个错误了。