2011-06-07 32 views
2

是否可以重新解釋已傳遞到OpenCL內核的參數?例如,如果我有一個正在傳入的整型數組,但我想將索引16處的整數解釋爲一個float(不要問爲什麼!),那麼我會認爲這會起作用。在OpenCL 1.0中重新解釋參數的問題

__kernel void Test(__global float* im, __constant int* constArray) 
{ 
    float x = *((__constant float*) &constArray[16]); 
    im[0] = x; 
} 

不過,我得到一個CL_INVALID_COMMAND_QUEUE錯誤,當我下一次嘗試使用命令隊列,這意味着上面的代碼執行了非法操作。

任何暗示上述有什麼問題和/或如何實現重新解釋?

我現在已經嘗試:

__kernel void Test(__global float* im, __constant int* constArray) 
{ 
    float x = as_float(0x3f800000); 
    im[0] = x; 
} 

,這確實給一個1.0F在IM [0]。但是,不管constArray [16]中的內容如何,​​在im [0]中總是導致零。

Regards,

Mark。

+0

希望你實際上將x定義爲最後兩種情況下的浮點數? – talonmies 2011-06-07 14:46:38

+0

oops。對不起,對!生病編輯這個問題來反映這一點。非常感謝您花時間幫助 – 2011-06-07 14:51:10

回答

1

OpenCL包含as_typen運算符家族,用於重新解釋將值從一種類型轉換爲另一種類型。如果我理解這個問題,你應該可以做類似於

__kernel void Test(__global float* im, __constant int* constArray) 
{ 
    float x = as_float(constArray[16]); 
    im[0] = x; 
} 
+0

感謝您的回覆。我嘗試了as_float,雖然這不會導致無效的命令隊列,但結果始終爲零。對於更改傳入內核的數據類型似乎有些奇怪。它似乎不取決於數據是__constant還是__global。 – 2011-06-07 14:24:20

+0

哪個工具包,操作系統和硬件正在使用? – talonmies 2011-06-07 14:41:24

+0

Ubuntu 64位,NVidia Quadro 6000,NVidia驅動程序270.41.19 – 2011-06-07 14:45:05