2012-12-29 39 views
6

在「CUDA C編程指南5.0」中,p73指出「駐留在全局內存中或由驅動程序或運行時API的內存分配例程之一返回的變量的任何地址總是對齊至少256個字節」。我不知道這句話的確切含義。任何人都可以爲我展示一個例子嗎?非常感謝。cuda對齊256bytes嚴重嗎?

衍生問題: 那麼,怎麼樣分配基本元素(如int)或自定義元素的一維數組?數組的起始地址將是256B的倍數,而數組中每個元素的地址不一定是256B的倍數?

+2

任何cudaMalloc的起始地址將是256的倍數。256是十六進制中的兩個符號,它們在addrexx中將爲零;所以你可以得到地址如0x0456ad00而不是0x0456ad80。 – osgx

回答

8

其通過使用任何的CUDA運行時的設備的內存分配功能分配的指針例如cudaMalloccudaMallocPitch保證是256字節對齊,即,該地址是256

倍數考慮下面的例子:

char *ptr1, *ptr2; 

int bytes = 1; 

cudaMalloc((void**)&ptr1,bytes); 
cudaMalloc((void**)&ptr2,bytes); 

假設在ptr1返回的地址是256多一些,那麼地址ptr2返回值將是ATLEAST (ptr1 + 256)

這是分配內存的設備施加的限制。大多數情況下,指針因性能目的而對齊。 (一些NVIDIA的人應該能夠判斷是否還有其他原因)。

重要:

指針對準並不總是256。在我的設備(GTX460M)上,它是512.您可以通過cudaDeviceProp::textureAlignment字段獲得設備指針對齊。

指針的對齊也是將指針綁定到紋理的要求。

+2

提供方便的紋理綁定到通過cudaMalloc()分配的內存而無需訴諸紋理偏移是除了由cudaMalloc()提供的指針對齊性能之外的另一個原因。 – njuffa

+0

我添加了一個衍生問題。請幫我弄清楚@ sgar91。 – Rock

+0

你確定'cudaMalloc()'的任何結果的排列不小於'cudaDeviceProp :: textureAlignment'嗎? – einpoklum