我试图将映射为零拷贝的主机内存绑定到纹理,但看起来不可能。
以下是代码示例:
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);
是否建议您使用固定内存并将其复制到绑定到纹理的设备内存中?
答案 0 :(得分:1)
这是可能的,但您必须确保音高正确对齐 - 至少64B粒度。我没有看到你可以使用的cudaDeviceProp中的对齐要求。 cudaDeviceProp :: textureAlignment将为您提供合适的指导 - 这是纹理基址的对齐要求,而不是音高;但我认为对齐要求比音高对齐要求更严格。
不幸的是,没有cudaHostAllocPitch()可以为您解决这个问题。
公平警告:我已经对1D纹理从主机内存进行了相当多的定向性能测试,它是s-l-o-w。特斯拉级硬件的速度为2G / s,费米级硬件的速度为0.5 G / s。我没有理由相信2D纹理会更快。