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

How can I interpolate a set of precomputed functions in OpenCL?

本文关键字:一组 计算 函数 OpenCL 插入      更新时间:2023-10-16

我正在使用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中会是什么样子。

在OpenCL 1.1中使用read_imagefimage3d_t作为第一个参数,sampler_tCLK_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。