代码之家  ›  专栏  ›  技术社区  ›  astrowalker

如何将double数组绑定到texture2D?

  •  -1
  • astrowalker  · 技术社区  · 7 年前

    我尝试使用纹理内存/绑定,而不是全局内存,但我不能通过绑定纹理。我学到的第一件事是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;
    }
    

    此绑定失败,错误为“invalid argument”。宽度和高度为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 回复  |  直到 7 年前
        1
  •  1
  •   Ander Biguri    7 年前

    你应该做出适当的分配

    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错误通常不是很有用,但是您得到的“invalid argument”是非常有用的。在函数中输入的参数无效。