在CUDA中使用固定映射内存绑定纹理

时间:2010-04-14 23:15:34

标签: memory cuda textures

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

以下是代码示例:

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);

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

1 个答案:

答案 0 :(得分:1)

这是可能的,但您必须确保音高正确对齐 - 至少64B粒度。我没有看到你可以使用的cudaDeviceProp中的对齐要求。 cudaDeviceProp :: textureAlignment将为您提供合适的指导 - 这是纹理基址的对齐要求,而不是音高;但我认为对齐要求比音高对齐要求更严格。

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

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