2010-04-14 61 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紋理會更快。