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也會有所幫助。
謝謝。我希望不必通過參數集合(它至少使用六個不同的內核),但這是一個可行的解決方案。我是否正確,因爲'__constant'不是來自每個內核可用的有限內存? –
有人想知道,爲什麼編譯器不會對未初始化的全局變量發出警告。 –
您可以使用帶有CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE的'clGetDeviceInfo(...)'方法獲取設備上常量緩衝區(這些變量標記爲__constant)的可用字節數。通過'CL_DEVICE_LOCAL_MEM_SIZE'獲取設備的本地內存大小(標記爲__local的變量)。還有一點需要注意......可以傳遞給內核的__constant參數的數量是有限制的。要獲得該號碼,請傳遞'CL_DEVICE_MAX_CONSTANT_ARGS'。 OpenCL規範指出,最小值爲8(但可能更多取決於設備)。 –