簡體   English   中英

有沒有辦法在 OpenCl 中加載大小等於 GPU 的全局內存大小的向量?

[英]Is there a way to load a vector equal by size to global memory size of GPU in OpenCl?

我的 GPU 有 12 GB 全局內存 (CL_DEVICE_GLOBAL_MEM_SIZE),但它只能分配 3 GB 內存 (CL_DEVICE_MAX_MEM_ALLOC_SIZE)。 當我嘗試加載大小超過 3 GB 的向量時,程序崩潰。 問題是,如果可以將更大的向量加載到 GPU 內存中以完全利用它,該怎么做?

默認情況下, CL_DEVICE_MAX_MEM_ALLOC_SIZE報告CL_DEVICE_GLOBAL_MEM_SIZE的 1/4,這意味着它只允許在 12GB GPU 上分配四個 3GB 緩沖區。

但是,Nvidia GPU 允許在單個緩沖區中分配其全部內存容量,即使它們也報告有 1/4 的限制。

一些 AMD GPU 的限制設置更高,例如 Radeon VII 允許您將 14/16GB 用於單個緩沖區。

我見過的唯一真正實施 1/4 限制的設備是 Intel HD 4600 和 5500,因此較舊的 Intel 集成 GPU。 如果那里的緩沖區大小超過 1/4,則cl::Buffer構造函數會拋出錯誤-61

如果您遇到設備上的 1/4 內存限制,請將您的 12GB 大緩沖區拆分為 4 個較小的 3GB 緩沖區(例如,一個向量分別代表向量的 x、y、z、w 分量)。 如果您使用 Windows,請注意您總共只能使用約 11.5GB,因為為操作系統保留了一些 VRAM。


我認為您的問題可能不是CL_DEVICE_MAX_MEM_ALLOC_SIZE ,而是超過 4GB 的數組大小的 32 位整數溢出。 請改用uint64_t數據類型來設置數組大小。


您可能還對這個用於 C++ 的輕量級OpenCL-Wrapper感興趣。 在那里,向量的長度始終為 64 位整數,它會自動跟蹤您在每個設備上總共使用了多少內存,告訴您是否分配了太多。 它還捕捉到英特爾 iGPU 上的-61錯誤,然后告訴您允許的最大緩沖區大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM