如何在OpenCL中插入一组预先计算的函数?

时间:2014-08-19 20:20:25

标签: c++ opencl interpolation

我正在使用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。

1 个答案:

答案 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。