我在我的OpenCL內核中有相當多的常量來管理內存分配,循環迭代次數等。使用全局__constants或#define會更快嗎?OpenCL __constant vs #define
2
A
回答
4
同樣的規則作爲用於「正常的」 C編譯器應用到OpenCL編譯:甲#define
之前實際編譯替換爲值,因此它們烘烤到內核中。
根據定義,一個__constant
變量被分配在全局內存中,並且必須在使用前傳輸。這比使用#define
d文字要慢。然而,NVIDIA和AMD的GPU架構緩存這些值,並且比普通全局內存讀取速度更快。故事的
末和我個人的建議是:使用#defines
恆定值,以及「魔術」號和__constant
內存大速度快,但只讀存儲器模塊(例如查找表)。
1
define的工作方式與C相同。此例外是AMD APP SDK v2.8之前的所有版本(不支持OpenCL 1.2)。
__Constant是cahched內存空間。請閱讀關於OpenCL內存佈局的更多信息。
__global是GPU的總內存,對所有線程都可見。
__local是GPU的本地內存,僅可由塊內的線程看到。
__constant是高速緩存的內存,它比全球的要快得多,但是有限,所以只有在需要時才使用它。
__private是GPU的私有內存,僅由每個單獨的線程可見。
注:線程,我的意思是處理元素。
相關問題
- 1. OpenCL:__constant vs. __local?
- 2. OpenCL:__constant內存和const之間的區別__global內存
- 3. RequireJs - Define vs Require
- 4. OpenCL enqueTask vs enqueNDRangeKernel
- 5. OpenCL vs OpenMP性能
- 6. #define vs self.method檢查分配
- 7. DEFINE VS變量在PHP
- 8. ANSI C#define VS函數
- 9. 內聯函數VS的#define
- 10. CUDA vs OpenCL性能對比
- 11. OpenCL的標VS矢量
- 12. OpenCL的,半浮VS性能
- 13. OpenCL的固定內存VS堆內存
- 14. const vs #define(奇怪的行爲)
- 15. #define vs const並鏈接框架
- 16. 的#define MY_INT VS const int的MY_INT
- 17. 並行編程模式:Scala vs OpenCL
- 18. OpenCL CPU設備vs GPU設備
- 19. OpenCL編譯選項ATI vs NVIDIA
- 20. OpenCL版本的cudaMemcpyToSymbol&優化
- 21. PyOpenCL vs Clyther vs純OpenCL和C99:新手最適合什麼?
- 22. #define
- 23. OpenCL全球陣列
- 24. OpenCL的數組索引好像斷
- 25. OpenCL內核沒有矢量化
- 26. 的#define遠,近的#define WINDEF.H
- 27. Scheme define-macro和/或define-syntax
- 28. openCL CL_OUT_OF_RESOURCES錯誤
- 29. #ifndef #define
- 30. 「static const」vs「#define」爲了提高效率C
我同意你的看法,除了必須傳遞常量內存這一事實。我從來沒有設法做到這一點。對我來說,使用常量內存的唯一方法是使用#define定義大型常量數組的值... – 2013-02-28 18:52:05
您可以像設置了CL_MEM_READ_ONLY標誌一樣創建一個常量內存緩衝區,就像其他任何內存緩衝區一樣。要傳輸它,你可以使用'CL_MEM_COPY_HOST_PTR'標誌或像往常一樣拷貝'clEnqueueWriteBuffer'。 – matthias 2013-03-01 08:47:38
如果您正在使用__constant緩衝區,請記住檢查設備信息屬性CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE以獲取最大恆定緩衝區大小。 – 2013-03-02 03:09:21