2011-04-25 59 views
2

我無法抓取浮動紋理。紋理被定義爲如下:正在抓取CUDA紋理問題

texture<float, 2, cudaReadModeElementType> cornerTexture; 

的結合和參數設置爲:

cornerTexture.addressMode[0] = cudaAddressModeClamp; 
cornerTexture.addressMode[1] = cudaAddressModeClamp; 
cornerTexture.filterMode  = cudaFilterModePoint; 
cornerTexture.normalized  = false; 
cudaChannelFormatDesc cornerDescription = cudaCreateChannelDesc<float>(); 


cudaBindTexture2D(0, &cornerTexture, cornerImage->imageData_device, &cornerDescription, cornerImage->width, cornerImage->height, cornerImage->widthStep); 

heightwidth是兩個維度的尺寸中的元素的數量而言。 widthStep用字節數表示。在內核訪問發生如下:

thisValue = tex2D(cornerTexture, thisPixel.x, thisPixel.y); 
printf("thisPixel.x: %i thisPixel.y: %i thisValue: %f\n", thisPixel.x, thisPixel.y, thisValue); 

thisValue應始終是一個非負浮點數。 printf()給了我奇怪的,無用的值,它與線性內存實際存儲的值不同。我試圖用兩個座標上的0.5f來抵消訪問,但它給了我相同的錯誤結果。

任何想法?

更新似乎有一個隱藏的對齊要求。根據我的推論,傳遞給cudaBindTexture函數的音調需要是32個字節的倍數。

cudaBindTexture2D(0, &debugTexture, deviceFloats, &debugDescription, 32, 10, 128) 

我不知道是否:例如,下面獲取的紋理時,但以下(其寬度和高度切換在同一陣列)效果很好給出不正確的結果

cudaBindTexture2D(0, &debugTexture, deviceFloats, &debugDescription, 10, 32, 40) 

我錯過了一些東西,或者球場上真的有一些限制。

更新2:我已經向Nvidia提交了一個錯誤報告。有興趣的人可以在他們的開發區查看,但我會在這裏回覆。

+1

如果在printf中使用」%f「佔位符而非%i,則會發生什麼情況 – Mat 2011-04-25 12:12:30

+0

廢話,你是對的,有史以來最愚蠢的錯誤... – 2011-04-25 12:18:59

+0

其實,問題仍然存在,它仍然給我不正確的值 – 2011-04-25 12:45:08

回答

2

Nvidia的回覆錯誤報告:

「這裏的問題是,綁定到2D紋理內存沒有正確對齊限制這兩個基地的紋理內存偏移,並在球場上,有一定的HW依賴對齊限制。但是,目前在CUDA API中,我們只將基本偏移限制作爲設備屬性公開,而不是音高限制。

音高限制將在未來的CUDA版本中解決。同時,建議應用程序在分配傾斜內存時使用cudaMallocPitch(),以便驅動程序負責滿足所有限制。「

1

您是否使用cudaGetTextureReference函數獲得了與紋理關聯的結構?

從NVIDIA C程序設計指南(第32頁,最後一段)的版本3.2:

紋理結合到紋理引用必須聲明紋理參考時指定的參數相匹配時指定的格式;否則,紋理提取的結果未定義爲

+0

感謝您的回覆。我正在使用高級API;即將'cornerDescription'作爲參數傳遞給'cudaBindTexture2D()',這會刪除幾行代碼,並使'cudaGetTextureReference()'成爲冗餘。 – 2011-04-25 18:55:03

+1

我一直在閱讀,更多的人遇到了32位對齊的問題,但沒有關於官方答案的線索。它假設內存是對齊的,對吧?你如何malloc記憶?在調用cudaBindTexture2D()?時,你能得到偏移量的值(第一個參數)嗎? – pQB 2011-04-26 09:27:14

+0

你有沒有考慮使用CUDA數組進行紋理處理? 此致! – pQB 2011-04-26 09:27:59

3

音高絕對有限制,很遺憾沒有設備屬性查詢來問CUDA它是什麼。

但是,如果您使用cudaMallocPitch()分配存儲空間並使用傳回的音高,則可以保證工作。