如何将双精度数组绑定到texture2D?

时间:2018-10-12 10:46:27

标签: cuda texture2d

我尝试使用纹理内存/绑定而不是全局内存,但是无法通过绑定纹理传递。我了解到的第一件事是CUDA不支持双重纹理,所以需要强制转换。

我声明了全局纹理变量:

texture<int2, 2> texData;

然后在分配大小(以字节为单位)cudaMalloc的设备内存(width*height * sizeof(double))之后,我尝试将其绑定:

cudaChannelFormatDesc desc = cudaCreateChannelDesc<int2>();
cudaStatus = cudaBindTexture2D(nullptr, &texData, dev_data, &desc,  width, height, 0);
if (cudaStatus != cudaSuccess) {
    fprintf(stderr, "Binding texture failed: %s\n", cudaGetErrorString(cudaStatus));
    goto Error;
}

此绑定失败,并显示错误“无效参数”。宽度和高度为2048,远低于纹理2d的限制:65536 x 65536 x 1048544。

那我在这里做错了什么?

边注:cudaBindTexture2D的签名:

extern __host__ cudaError_t CUDARTAPI cudaBindTexture2D(size_t *offset, 
    const struct textureReference *texref, const void *devPtr, 
    const struct cudaChannelFormatDesc *desc, size_t width, size_t height, size_t pitch);

1 个答案:

答案 0 :(得分:1)

您应该进行适当的分配

size_t pitch;
cudaMallocPitch((void**)&dev_data, &pitch, width* sizeof(double),height);

cudaChannelFormatDesc desc = cudaCreateChannelDesc<int2>();

cudaStatus = cudaBindTexture2D(nullptr, texData, dev_data, desc,  width, height, pitch);

请注意,虽然CUDA错误通常不是很有用,但您收到的“无效参数”却是很有用的。您在函数中输入的参数无效。