首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用CUDA纹理内存进行插值

使用CUDA纹理内存进行插值
EN

Stack Overflow用户
提问于 2012-08-22 16:49:41
回答 2查看 4.1K关注 0票数 1

我想使用纹理内存进行数据插值。我有两个数组(即Ai和Bi),我想在它们之间插入数据。我认为我可以将它们绑定到纹理内存并设置插值,但我不确定如何才能做到这一点。

CUDA附带的示例使用Ai-1和Ai+1进行插值。

有没有办法按我的计划去做?我尝试这样做是因为我认为我可以获得很好的加速效果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-22 22:28:55

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

如果您想要在CUDA中自己手动编写代码,您需要的代码如下所示:

代码语言:javascript
运行
复制
// 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 (根据我的经验,它比我尝试手工编写代码的速度更快,更不用说使用起来更简单了),那么您将希望:

代码语言:javascript
运行
复制
// 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

票数 2
EN

Stack Overflow用户

发布于 2012-08-22 17:04:37

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

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

请记住,优化得越早,调试就越困难。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12069448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档