我想使用纹理内存进行数据插值。我有两个数组(即Ai和Bi),我想在它们之间插入数据。我认为我可以将它们绑定到纹理内存并设置插值,但我不确定如何才能做到这一点。
CUDA附带的示例使用Ai-1和Ai+1进行插值。
有没有办法按我的计划去做?我尝试这样做是因为我认为我可以获得很好的加速效果。
发布于 2012-08-22 22:28:55
是的,你可以用纹理内存做到这一点,而且速度很快。我个人使用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。
发布于 2012-08-22 17:04:37
如果您不习惯使用CUDA进行开发,那么开始使用纹理内存并不是一件容易的事情。
我建议你在没有优化的情况下,尝试用CUDA语言编写算法的第一个并行版本。然后,在您的应用程序上使用NVIDIA Visual Profiler来确定您是否需要设置纹理内存来优化内存访问。
请记住,优化得越早,调试就越困难。
最后但并非最不重要的是,最新的CUDA版本(CUDA5,仍在发布候选版本)能够自动将数据存储在纹理内存中,只要您将作为参数传递给内核的输入缓冲区声明为const restrict指针。
https://stackoverflow.com/questions/12069448
复制相似问题