Performance 优化CUDA插值

Performance 优化CUDA插值,performance,optimization,cuda,interpolation,Performance,Optimization,Cuda,Interpolation,我用CUDA开发了以下插值,我正在寻找一种改进这种插值的方法。由于某些原因,我不想使用CUDA纹理 我注意到的另一点是,由于一些未知的原因,在我的例子中,如果向量的大小大于线程数,则不会对整个向量执行插值(例如,对于大小为1000的向量,线程数等于512,。一个线程执行其第一个任务,仅此而已。我想优化singleInterp函数 这是我的密码: __device__ float singleInterp(float* data, float x, int lx_data) { float r

我用CUDA开发了以下插值,我正在寻找一种改进这种插值的方法。由于某些原因,我不想使用CUDA纹理

我注意到的另一点是,由于一些未知的原因,在我的例子中,如果向量的大小大于线程数,则不会对整个向量执行插值(例如,对于大小为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;

}
\uuuuuu设备\uuuuuuuuuuuuuuuuuuuoSingleInterp(float*数据、float x、int lx\u数据){
浮点数res=0;
int i1=0;
int j=lx_数据;
int imid;
而(j>i1+1)
{  
imid=(int)(i1+j+1)/2;

如果(data[imid]您似乎对一维线性插值感兴趣。我已经遇到了优化这种插值的问题,我最终得到了以下代码

__global__ void linear_interpolation_kernel_function_GPU(double* __restrict__ result_d, const double* __restrict__ data_d, const double* __restrict__ x_out_d, const int M, const int N)
{
    int j = threadIdx.x + blockDim.x * blockIdx.x;

    if(j<N)
    {
        double reg_x_out = x_out_d[j/2]+M/2;
        int k = floor(reg_x_out);
        double a = (reg_x_out)-floor(reg_x_out);
        double dk = data_d[2*k+(j&1)];
        double dkp1 = data_d[2*k+2+(j&1)];
        result_d[j] = a * dkp1 + (-dk * a + dk);
    } 
 }
\uuuuu全局\uuuuuuu无效线性插值\uuuu核函数\uuuu GPU(双*\uuuuu限制\uuuuuuuuu结果\d,常数双*\uuuuu限制\uuuuuuuuu数据\d,常数双*\uuuuuuuu限制\uuuuuuuuuuuuu输出\d,常数整数M,常数整数N)
{
int j=threadIdx.x+blockDim.x*blockIdx.x;

如果(j)启动时使用了多少个块?您能列出内核设置和调用代码吗?您需要正确计算所需的块数,给定要处理的项目数和每个块的线程数。在上面的示例中,您需要2个块。
__global__ void linear_interpolation_kernel_function_GPU(double* __restrict__ result_d, const double* __restrict__ data_d, const double* __restrict__ x_out_d, const int M, const int N)
{
    int j = threadIdx.x + blockDim.x * blockIdx.x;

    if(j<N)
    {
        double reg_x_out = x_out_d[j/2]+M/2;
        int k = floor(reg_x_out);
        double a = (reg_x_out)-floor(reg_x_out);
        double dk = data_d[2*k+(j&1)];
        double dkp1 = data_d[2*k+2+(j&1)];
        result_d[j] = a * dkp1 + (-dk * a + dk);
    } 
 }