編寫一個計算簡單函數積分的程序。當測試它時,我發現如果我使用了一個大於1000萬個元素的數組,它會產生錯誤的答案。我發現一旦數組在CUDA內核中被操作,就會發生錯誤。 1000萬以下的元素工作得很好,併產生了正確的結果。CUDA中可以使用的數組大小是否有限制?
是否存在可傳輸到GPU或根據GPU計算的元素數量限制?
P.S.使用包含浮動的C風格數組。
編寫一個計算簡單函數積分的程序。當測試它時,我發現如果我使用了一個大於1000萬個元素的數組,它會產生錯誤的答案。我發現一旦數組在CUDA內核中被操作,就會發生錯誤。 1000萬以下的元素工作得很好,併產生了正確的結果。CUDA中可以使用的數組大小是否有限制?
是否存在可傳輸到GPU或根據GPU計算的元素數量限制?
P.S.使用包含浮動的C風格數組。
您可以在CUDA中使用多種不同的內存。特別是,你有
cuMemAlloc
)cuMemHostAlloc
)cuMemAllocHost
)cuMemAllocPitch
)每種內存都與自己的硬件資源限制相關聯,其中許多內容可以通過使用cuDeviceGetAttribute
找到。函數cuMemGetInfo
返回設備上的空閒內存和總內存量,但由於對齊要求,分配1,000,000
浮點數可能導致消耗大於1,000,000 * sizeof(float)
個字節。您可以一次安排的塊的最大數量也是一個限制:如果超過它,內核將無法啓動(您可以使用cuDeviceGetAttribute
輕鬆找到該數字)。您可以使用CUDA Driver API找出不同內存量的對齊要求,但對於一個簡單的程序,您可以進行合理的猜測並檢查分配函數的值,以確定分配是否成功。
您可以傳輸的字節數沒有限制;使用異步功能,您可以將內核執行與內存複製重疊(只要您的卡支持此功能)。超過您可以調度的最大塊數,或者消耗設備上可用的內存意味着您將不得不拆分任務,以便可以使用多個內核來處理它。
對於計算能力> = 3.0,最大網格尺寸爲2147483647x65535x65535, 因此對於那些應該覆蓋任何尺寸高達2147483647x1024 = 2.1990233e + 12的1-D數組。
10億個元素數組絕對沒問題。
1,000,000,000/1024 = 976562.5,並舍入到976563塊。只要確保如果threadIdx.x + blockIdx.x * blockDim.x> =您從內核返回而未經處理的元素數量。
數組有多大,以字節爲單位? –
您的GPU是否連接到顯示器? – talonmies