GPU(OpenCL)上线性三维纹理插值的数值精度

问题描述 投票:0回答:1

我使用GPU来加速分子动力学,我在3D纹理中存储远程力场(例如静电)。

我发现与我在C ++ / CPU中实现的三线性插值相比,存在相当大的数值误差~1.0E-3。虽然CPU曲线完全平滑,但GPU曲线的相对噪声水平为~1.0E-3。是的GPU只使用单精度(float32)但仍然~~ 1.0E-3比float32精度(~1.0E-8)差得多。

这是正常的吗?有没有办法在仍然使用硬件纹理插值的同时提高准确性?

细节:

OpenCL的:

__constant sampler_t sampler_1 = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_REPEAT | CLK_FILTER_LINEAR;
float4 fe = read_imagef( imgCoulomb,  sampler_1, coord );

C ++包装器:

p_gpu = clCreateImage3D(context, flags, {CL_RGBA, CL_FLOAT}, nImg[0],nImg[1],nImg[2], 0, 0, p_cpu, &err);

系统设置:

GPU: Quadro K2200/PCIe/SSE2
Ubuntu 16.04 LTS

结果:

enter image description here

textures opencl interpolation precision
1个回答
0
投票

是的,GPU经常采用纹理插值的快捷方式。例如,它们在值之间可能只有256步,因此如果这些值相距很远,那么您将无法获得更高的准确度。请记住,它们针对游戏和图形进行了优化(这些快捷方式不可见),而不是科学计算。如果您的应用程序要求准确性,请使用int2坐标(和NEAREST采样)读取值并在float中进行插值。根据我的经验,它不会比使用纹理插值慢,因为相同的读取正在发生,并且内存带宽通常是瓶颈(不是计算)。

© www.soinside.com 2019 - 2024. All rights reserved.