1

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

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

有什么办法可以按照我的计划去做吗?我正在尝试这个,因为我认为我可以获得很好的加速。

4

2 回答 2

2

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

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

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

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

于 2012-08-22T09:04:36.873 回答
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 个不同数组或矩阵的相应索引之间进行插值。还有其他可用的插值函数

于 2012-08-22T14:28:54.887 回答