CUDA を使用して次の補間を開発しました。この補間を改善する方法を探しています。何らかの理由で、CUDA テクスチャを使用したくありません。
いくつかの未知の理由で気づいたもう 1 つの点は、ベクトルのサイズがスレッドの数よりも優れている場合 (たとえば、サイズ 1000 のベクトルの場合、私の場合はベクトル全体で補間が実行されないことです。 512 に等しいスレッド数. スレッドは最初のジョブを実行し、それだけです. singleInterp 関数を最適化したいと思います.
これが私のコードです:
__device__ float singleInterp(float* data, float x, int lx_data) {
float res = 0;
int i1=0;
int j=lx_data;
int imid;
while (j>i1+1)
{
imid = (int)(i1+j+1)/2;
if (data[imid]<x)
i1=imid;
else
j=imid;
}
if (i1==j)
res = data[i1+lx_data];
else
res =__fmaf_rn( __fdividef(data[j+lx_data]-data[i1+lx_data],(data[j]-data[i1])),x-data[i1], data[i1+lx_data]);
return res;
}
カーネル:
__global__ void linearInterpolation(float* data, float* x_in, int lx_data) {
int i = threadIdx.x + blockDim.x * blockIdx.x;
int index = i;
if (index < lx_data)
x_in[index] = singleInterp(data, x_in[index], lx_data);
}