OpenCL中的常量数组初始化器中的三角函数

时间:2013-09-29 21:25:28

标签: constants 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
};

这段代码拒绝为我编译。我得到的错误信息是 错误:初始化元素不是编译时常量。如果必须在设备上调用数学函数以使数组获取其值,我就能理解它。如果是这种情况,我可以制作一个内核来计算这些值,而不用大惊小怪。但是,这种方法对我来说会更方便。有没有什么方法可以在常量内存中声明这些值?您是否看到此方法或代码存在任何其他问题?

1 个答案:

答案 0 :(得分: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而不是假定的零值。