記憶體標誌
分配記憶體時,你可以選擇不同的模式:
- 只讀記憶體
- 只寫記憶體
- 讀/寫記憶體
只讀儲存器分配在__constant 儲存區中,而其他兩個儲存區分配在普通的__global 區域中。
除了可訪問性之外,你還可以定義記憶體的分配位置。
- 未指定:你的記憶體按照你的預期分配在裝置記憶體中。 $ source 指標可以設定為 null。
- CL_MEM_USE_HOST_PTR:這告訴裝置資料在系統 RAM 中,不應該移動。相反,資料直接在 ram 中操作。
- CL_MEM_COPY_HOST_PTR:告訴裝置將給定地址的所有值複製到裝置儲存器,或者使用 CL_MEM_ALLOC_HOST_PTR 複製到系統 RAM 中的單獨儲存區域。
- CL_MEM_ALLOC_HOST_PTR:告訴裝置在系統 RAM 上分配空間。如果用作唯一引數,則$ source 指標可以設定為 null。
速度方面,訪問裝置全域性記憶體是最快的。但是你還需要呼叫它兩次才能複製資料。使用 Host-pointer 是最慢的,而 Alloc_host_ptr 提供更高的速度。
當使用 use_host_ptr 時,裝置就是這樣做的:它使用系統 ram 中的資料,當然這是由作業系統分頁的。因此,每次記憶體呼叫都必須通過 cpu 來處理潛在的頁面錯誤。當資料可用時,cpu 將其複製到固定儲存器中,並使用寶貴的 CPU 時鐘週期將其傳遞給 DMA 控制器。相反,alloc_host_ptr 在系統 ram 中分配固定記憶體。此記憶體位於 pageswap 機制之外,因此具有可保證的可用性。因此,裝置可以在訪問系統 RAM 時完全跳過 cpu,並利用 DMA 將資料快速複製到裝置。