2012-05-03 58 views
2

編寫一個計算簡單函數積分的程序。當測試它時,我發現如果我使用了一個大於1000萬個元素的數組,它會產生錯誤的答案。我發現一旦數組在CUDA內核中被操作,就會發生錯誤。 1000萬以下的元素工作得很好,併產生了正確的結果。CUDA中可以使用的數組大小是否有限制?

是否存在可傳輸到GPU或根據GPU計算的元素數量限制?

P.S.使用包含浮動的C風格數組。

+0

數組有多大,以字節爲單位? –

+0

您的GPU是否連接到顯示器? – talonmies

回答

3

您可以在CUDA中使用多種不同的內存。特別是,你有

  • 線性存儲器(cuMemAlloc
  • 固定內存(cuMemHostAlloc
  • 零拷貝內存(cuMemAllocHost
  • 間距分配(cuMemAllocPitch
  • 紋理綁定到線性內存
  • 綁定到CUDA陣列的紋理
  • 紋理綁定到音高備忘錄ry
  • ...和立方體貼圖和曲面,我不會在這裏列出。

每種內存都與自己的硬件資源限制相關聯,其中許多內容可以通過使用cuDeviceGetAttribute找到。函數cuMemGetInfo返回設備上的空閒內存和總內存量,但由於對齊要求,分配1,000,000浮點數可能導致消耗大於1,000,000 * sizeof(float)個字節。您可以一次安排的塊的最大數量也是一個限制:如果超過它,內核將無法啓動(您可以使用cuDeviceGetAttribute輕鬆找到該數字)。您可以使用CUDA Driver API找出不同內存量的對齊要求,但對於一個簡單的程序,您可以進行合理的猜測並檢查分配函數的值,以確定分配是否成功。

您可以傳輸的字節數沒有限制;使用異步功能,您可以將內核執行與內存複製重疊(只要您的卡支持此功能)。超過您可以調度的最大塊數,或者消耗設備上可用的內存意味着您將不得不拆分任務,以便可以使用多個內核來處理它。

0

對於計算能力> = 3.0,最大網格尺寸爲2147483647x65535x65535, 因此對於那些應該覆蓋任何尺寸高達2147483647x1024 = 2.1990233e + 12的1-D數組。

10億個元素數組絕對沒問題。

1,000,000,000/1024 = 976562.5,並舍入到976563塊。只要確保如果threadIdx.x + blockIdx.x * blockDim.x> =您從內核返回而未經處理的元素數量。

相關問題