我正在使用OpenCL内核,我需要使用相关的勒让德多项式。
这是一组相当难以计算的多项式,它们由整数n和m阶索引,并接受一个真实的参数。实际多项式的细节是无关紧要的,因为我有一个(慢)主机端函数可以生成它们,但内核函数需要看起来像:
float legendre(int n, int m, float z)
{
float3 lookupCoords;
lookupCoords.x = n;
lookupCoords.y = m;
lookupCoords.z = z;
//Do something here to interpolate Z for a given N and M...
}
我想沿Z轴插值,但是只有n轴和m轴的最近邻点,因为它们只是为整数值定义。 Z的好处是它只在-1和1之间定义,所以它看起来很像纹理坐标。
如何使用OpenCL中的采样器和查找表来实现此目的?
我的第一个想法是尝试使用填充了预先计算的订单的3D纹理,但我只想沿着一个维度(真实或Z参数)进行插值,而且我不确定它在OpenCL C。
答案 0 :(得分:2)
在OpenCL 1.1中,read_imagef
使用image3d_t
作为第一个参数,sampler_t
使用CLK_FILTER_LINEAR
为第二个参数创建,最后使用float4 coord
用于读取坐标的第三个参数。
要仅沿一个轴插值,让该坐标的值为任何浮点值,但使其他两个坐标为floor(value) + 0.5f
。这将使它们不进行插值。像这样(只插入z):
float4 coordinate = (float4)(floor(x) + 0.5f, floor(y) + 0.5f, z, 0.0f);
在OpenCL 1.2中,您可以使用图像阵列,但我不确定它会更快,NVIDIA不支持Windows上的OpenCL 1.2。