2014-02-28 112 views
2

OpenCL規範是否對可使用的私有內存數量設置了最大限制?如果是這樣,我該如何得到這個數字?OpenCL中的私有內存是否有最大限制?

我有一個功能,當外界的OpenCL運行其給出正確的結果,但在轉換爲內核,它噴出了垃圾。我使用CL_KERNEL_PRIVATE_MEM_SIZE標誌檢查了每個工作項使用的私有內存的數量,它的大小約爲4000字節。我懷疑我使用了太多的私人內存,這導致了垃圾計算。

回答

1

它對於不同的拱形不同。例如,每個計算單元的hd7870私有內存爲256kB,如果您的設置爲每個計算單元64個線程,則每個線程將擁有4kB私有內存,這意味着1000個浮點值。如果進一步增加每個計算單元的線程數,私有/線程將下降到1kB的範圍。您應該添加一些本地內存使用情況來平衡它。

更重要的是,你不能全部使用它。編譯器使用大部分來進行自己的優化以及一些我不知道的東西。如果沒有探查器,你永遠無法確定。

0

對於私有內存沒有理論限制(與本地內存不同)。如果有的話,clGetDeviceInfo會列出它(它不會)。但是,我知道有實際的限制。例如,一些GPU實現將嘗試將專用內存存儲在寄存器文件中,如果它適合的話。如果超過這個數字,它就會溢出到主存,並且可能會更貴。無論如何,結果應該是正確的(只是實現得慢得多)。它不應該垃圾你的計算。

+0

呈現http://www.computer-graphics.se/gpu-computing/opencl_pub.pdf幻燈片19說每個工作項目最多16個字節的私有內存。這與opencl規範是否一致? – user3011504

+0

有趣!感謝您的鏈接。我認爲這只是NVidia。我無法在OpenCL 1.1規範(http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf)中找到關於私有內存最小值的任何內容。本地內存和常量緩衝區有規範。這些值的最小值。我認爲你是在NVidia架構上? – Tim

+0

另外你的內核報告〜4k專用字節和幻燈片說16k的私人內存。所以你完全處於該實現的最大值之下。我的猜測是,如果你以某種方式超過編譯將會失敗。無論如何,使用這麼多私人內存是不尋常的。有沒有機會看到內核源代碼? – Tim

2

根據OpenCL規範,未定義位置和大小,即供供應商決定。這就提出了要使用多少的問題。如果正確使用獲得最佳性能,如果不能成爲放緩的原因。

您可以使用AMD的CodeXL或NVIDIA的Nsight(如果你有AMD或NVIDIA顯卡)由內核來分析內存使用情況。只需少量動手,您就可以使用這些工具瞭解註冊溢出。

我不認爲的專用內存使用率較高會導致垃圾結果,它肯定可以在你的代碼中的問題。

+0

NVIDIA的NSight似乎不適用於opencl代碼。對你起作用嗎? – user3011504

+0

哦,是嗎?我在AMD卡上工作,所以對nSight沒有太多的詳細信息。請看這個Unified Visual Profiler [鏈接](https://developer.nvidia.com/cuda-toolkit-31-downloads) – Meluha

相關問題