2011-08-21 77 views
2

我已經聲明爲全局(__constant)結構的一些基本參數,就像這樣:OpenCL - 從主機初始化程序範圍變量?

typedef struct 
{ 
    int a; 
    int b; 
    float c; 
    /// blah blah 

} SomeParams; 

__constant SomeParams Parameters; 
內核

,我需要使用它,像這樣:

__kernel void Foo() 
{ 
    int a = Parameters.a; 
    /// do something useful... 
} 

我不知道我在執行內核之前如何初始化來自主機的參數值。

我沒有問題爲內核參數創建緩衝區等,但由於這不是內核參數,我需要做什麼?

我正在使用Cloo C#/ OpenCL綁定,但即使是原始的CL API也會有所幫助。

回答

5

據我所知(但我不會發誓),你不能初始化主機代碼中以這種方式聲明的變量(有一個例外,見下文)。你可以聲明一個變量並初始化它是這樣的:

__constant float pi = 3.14f; 

你也可以做這樣的事情:

內核:__constant float width = WIDTH

主持人:建立與定義值-D構建參數內核WIDTH

我過去所做的是將常量變量作爲內核參數。

__kernel void Foo(__constant SomeParams Parameters) 
{ 
    int a = Parameters.a; 
    /// do something useful... 
} 

然後,您可以像其他任何內核參數一樣分配和設置該值。

+0

謝謝。我希望不必通過參數集合(它至少使用六個不同的內核),但這是一個可行的解決方案。我是否正確,因爲'__constant'不是來自每個內核可用的有限內存? –

+0

有人想知道,爲什麼編譯器不會對未初始化的全局變量發出警告。 –

+0

您可以使用帶有CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE的'clGetDeviceInfo(...)'方法獲取設備上常量緩衝區(這些變量標記爲__constant)的可用字節數。通過'CL_DEVICE_LOCAL_MEM_SIZE'獲取設備的本地內存大小(標記爲__local的變量)。還有一點需要注意......可以傳遞給內核的__constant參數的數量是有限制的。要獲得該號碼,請傳遞'CL_DEVICE_MAX_CONSTANT_ARGS'。 OpenCL規範指出,最小值爲8(但可能更多取決於設備)。 –