使用CUDA纹理内存进行插值

时间:2012-08-22 08:49:41

标签: cuda gpu textures gpu-programming cuda.net

我想使用纹理存储器进行数据插值。我有2个数组(即A [i]和B [i]),我想在它们之间插入数据。我以为我可以将它们绑定到纹理存储器并设置插值,但我不知道我该怎么做。

CUDA附带的示例使用A [i-1]和A [i + 1]进行插值。

有没有办法按我的计划行事?我正在尝试这个,因为我觉得我可以获得一个很好的加速。

2 个答案:

答案 0 :(得分:2)

如果您不习惯使用CUDA进行开发,那么使用纹理内存并不是最容易开始的事情。

我建议您尝试在CUDA中编写您的算法的第一个并行版而不进行优化。然后,在您的应用程序上使用NVIDIA Visual Profiler 来确定是否需要设置纹理内存以优化内存访问。

请记住越早优化,调试就越棘手

最后但并非最不重要的是,只要声明作为参数传递的输入缓冲区,最新的CUDA版本(CUDA 5,仍处于候选版本中)能够自动将数据存储在纹理内存中你的内核为const restrict指针。

答案 1 :(得分:2)

是的,你可以用纹理内存做到这一点,速度很快。我个人使用ArrayFire来完成这些操作,因为它比我希望手动编码更快。

如果你想亲自在CUDA中编写代码,那就是你想要的东西:

// outside kernel

texture<float,1>  A;
cudaChannelFormatDesc desc = cudaCreateChannelDesc<float>();
cudaArray *arr = NULL;
cudaError_t e = cudaMallocArray(&arr, &desc, 1, length);
A.filterMode = cudaFilterModePoint;
A.addressMode[0] = cudaAddressModeClamp;
cudaBindTextureToArray(A, arr, desc);

...

// inside kernel
    
valA = tex1D(A,1,idx)
valB = tex1D(B,1,idx)

float f = 0.5;
output  = (f)*valA + (1-f)*valB;

如果您只想插入ArrayFire(根据我的经验,它比我尝试手动编码的速度快,更不用说使用起来更简单了),那么您需要:

// in arrayfire
array A = randu(10,1);
array B = randu(10,1);
float f = 0.5;
array C = (f)*A + (1-f)*B;

以上假设您希望在2个不同数组或矩阵的相应索引之间进行插值。还有other interpolation functions可用。