在「CUDA C編程指南5.0」中,p73指出「駐留在全局內存中或由驅動程序或運行時API的內存分配例程之一返回的變量的任何地址總是對齊至少256個字節」。我不知道這句話的確切含義。任何人都可以爲我展示一個例子嗎?非常感謝。cuda對齊256bytes嚴重嗎?
衍生問題: 那麼,怎麼樣分配基本元素(如int)或自定義元素的一維數組?數組的起始地址將是256B的倍數,而數組中每個元素的地址不一定是256B的倍數?
在「CUDA C編程指南5.0」中,p73指出「駐留在全局內存中或由驅動程序或運行時API的內存分配例程之一返回的變量的任何地址總是對齊至少256個字節」。我不知道這句話的確切含義。任何人都可以爲我展示一個例子嗎?非常感謝。cuda對齊256bytes嚴重嗎?
衍生問題: 那麼,怎麼樣分配基本元素(如int)或自定義元素的一維數組?數組的起始地址將是256B的倍數,而數組中每個元素的地址不一定是256B的倍數?
其通過使用任何的CUDA運行時的設備的內存分配功能分配的指針例如cudaMalloc
或cudaMallocPitch
保證是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
字段獲得設備指針對齊。
指針的對齊也是將指針綁定到紋理的要求。
任何cudaMalloc的起始地址將是256的倍數。256是十六進制中的兩個符號,它們在addrexx中將爲零;所以你可以得到地址如0x0456ad00而不是0x0456ad80。 – osgx