2013-09-29 49 views
0

我在我的應用程序中使用了許多向量。在正方形網格中,這些是我可以從單元中心走向的主要方向和對角線方向的向量。我的OpenCL內核會經常使用它們,所以我想在常量內存中定義它們。我在我的內核文件中寫了如下一段代碼:OpenCL中常量數組初始值設定項中的三角函數

#define N_RADIAN 2 * M_PI_4_F 
#define NE_RADIAN 1 * M_PI_4_F 
#define E_RADIAN 0 * M_PI_4_F 
#define SE_RADIAN 7 * M_PI_4_F 
#define S_RADIAN 6 * M_PI_4_F 
#define SW_RADIAN 5 * M_PI_4_F 
#define W_RADIAN 4 * M_PI_4_F 
#define NW_RADIAN 3 * M_PI_4_F 

constant float2 E[8] = { 
(float2)(cos(N_RADIAN), sin(N_RADIAN)), // N 
(float2)(cos(NE_RADIAN), sin(NE_RADIAN)), // NE 
(float2)(cos(E_RADIAN), sin(E_RADIAN)), // E 
(float2)(cos(SE_RADIAN), sin(SE_RADIAN)), // SE 
(float2)(cos(S_RADIAN), sin(S_RADIAN)), // S 
(float2)(cos(SW_RADIAN), sin(SW_RADIAN)), // SW 
(float2)(cos(W_RADIAN), sin(W_RADIAN)), // W 
(float2)(cos(NW_RADIAN), sin(NW_RADIAN)) // NW 
}; 

此代碼拒絕爲我編譯。我得到的錯誤消息是 錯誤:初始化程序元素不是編譯時常量。我可以理解,如果必須在設備上調用數學函數來獲取數組的值。如果是這樣的話,我可以做一個內核來計算這些值而不用大驚小怪。但是,這種方法對我來說會更方便。有沒有什麼辦法可以在常量內存中聲明這些值?你是否看到這種方法或代碼的其他問題?

回答

3

我認爲與常量做到這一點的唯一方法是去像這樣的東西:

constant float2 E[8] = { 
    (0.0   , 1.0   ) , // N 
    (CL_M_SQRT1_2 , CL_M_SQRT1_2) , // NE 
    (1.0   , 0.0   ) , // E 
    (CL_M_SQRT1_2 , -CL_M_SQRT1_2) , // SE 
    (0.0   , -1.0  ) , // S 
    (-CL_M_SQRT1_2 , -CL_M_SQRT1_2) , // SW 
    (-1.0   , 0.0   ) , // W 
    (-CL_M_SQRT1_2 , CL_M_SQRT1_2)  // NW 
    }; 

的問題實際上可能因禍得福。該替代代碼生成的值可精確到32位IEEE浮點數的限制。由於pi/4和M_PI_4_F之間的差異,原始代碼有點偏離。例如,原始代碼生成餘弦(北)= -4.37114e-008,而不是可能的預期零值。

+0

簡單而準確。也許我會顛覆我最初的計劃。 – Steinin

相關問題