2013-02-27 38 views
2

我在我的OpenCL內核中有相當多的常量來管理內存分配,循環迭代次數等。使用全局__constants或#define會更快嗎?OpenCL __constant vs #define

回答

4

同樣的規則作爲用於「正常的」 C編譯器應用到OpenCL編譯:甲#define之前實際編譯替換爲值,因此它們烘烤到內核中。

根據定義,一個__constant變量被分配在全局內存中,並且必須在使用前傳輸。這比使用#define d文字要慢。然而,NVIDIA和AMD的GPU架構緩存這些值,並且比普通全局內存讀取速度更快。故事的

末和我個人的建議是:使用#defines恆定值,以及「魔術」號和__constant內存大速度快,但只讀存儲器模塊(例如查找表)。

+0

我同意你的看法,除了必須傳遞常量內存這一事實。我從來沒有設法做到這一點。對我來說,使用常量內存的唯一方法是使用#define定義大型常量數組的值... – 2013-02-28 18:52:05

+0

您可以像設置了CL_MEM_READ_ONLY標誌一樣創建一個常量內存緩衝區,就像其他任何內存緩衝區一樣。要傳輸它,你可以使用'CL_MEM_COPY_HOST_PTR'標誌或像往常一樣拷貝'clEnqueueWriteBuffer'。 – matthias 2013-03-01 08:47:38

+0

如果您正在使用__constant緩衝區,請記住檢查設備信息屬性CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE以獲取最大恆定緩衝區大小。 – 2013-03-02 03:09:21

1

define的工作方式與C相同。此例外是AMD APP SDK v2.8之前的所有版本(不支持OpenCL 1.2)。

__Constant是cahched內存空間。請閱讀關於OpenCL內存佈局的更多信息。

__global是GPU的總內存,對所有線程都可見。

__local是GPU的本地內存,僅可由塊內的線程看到。

__constant是高速緩存的內存,它比全球的要快得多,但是有限,所以只有在需要時才使用它。

__private是GPU的私有內存,僅由每個單獨的線程可見。

注:線程,我的意思是處理元素。