【发布时间】:2013-02-22 14:29:16
【问题描述】:
我已经使用 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;
}
内核:
__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);
}
【问题讨论】:
-
你用多少块启动?你能列出你的内核设置和调用代码吗?考虑到要处理的项目数以及每个块有多少线程,您需要正确计算所需的块数。在上面的示例中,您需要 2 个块。
标签: performance optimization cuda interpolation