2010-04-14 64 views
0

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

下面是一个代码示例:

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

全局定义纹理吗?如果您从主机内存中读取纹理,也可以使用cudaHostAllocWriteCombined – fabrizioM 2010-04-15 07:36:32

+0

是的,它是全局定义的。 cudaHostAllocWriteCombined通过避免缓存使得设备端的读取效率更高。 – sjchoi 2010-04-15 15:43:59

回答

1

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

不幸的是,没有cudaHostAllocPitch()为你照顾这件事。公平的警告:我已经完成了很多关于1D主机纹理的定向性能测试,它是s-l-o-w。特斯拉级硬件的速度为2G/s,费米级硬件速度为0.5 G/s。我没有理由相信2D纹理会更快。