【问题标题】:Bind texture with pinned mapped memory in CUDA将纹理与 CUDA 中的固定映射内存绑定
【发布时间】:2011-02-08 03:51:13
【问题描述】:

我试图将映射为零复制的主机内存绑定到纹理,但看起来不可能。

这是一个代码示例:

float* a;
float* d_a;
cudaSetDeviceFlags(cudaDeviceMapHost);
cudaHostAlloc( (void **)&a, bytes, cudaHostAllocMapped);
cudaHostGetDevicePointer((void **)&d_a,  (void *)a, 0);

texture<float, 2, cudaReadModeElementType> tex;
cudaBindTexture2D( 0, &tex, d_a, &channelDesc, width, height, pitch);

是否建议您使用固定内存并将其复制到绑定到纹理的设备内存?

【问题讨论】:

  • 纹理是全局定义的吗?如果您正在从主机内存中读取纹理,也可以使用 cudaHostAllocWriteCombined
  • 是的,它是全局定义的。 cudaHostAllocWriteCombined 只是通过避免缓存来提高设备端的读取效率。

标签: memory cuda textures


【解决方案1】:

这是可能的,但您必须确保间距正确对齐 - 至少 64B 粒度。我在 cudaDeviceProp 中看不到您可以使用的对齐要求。 cudaDeviceProp::textureAlignment 会给你很好的指导——这是纹理基地址的对齐要求,而不是间距;但我认为对齐要求比音高对齐要求更严格。

不幸的是,没有 cudaHostAllocPitch() 可以为您处理这个问题。

公平警告:我已经对主机内存的一维纹理进行了相当多的定向性能测试,它是 s-l-o-w。特斯拉级硬件的速度为 2G/s,费米级的硬件速度为 0.5 G/s。我没有理由相信 2D 纹理会更快。

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 2011-02-25
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多