我想在我的应用程序中使用一些矢量。在正方形网格中,这些是基数和对角线方向的向量,我可以从单元格的中心出发。我的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
};
这段代码拒绝为我编译。我得到的错误信息是 错误:初始化元素不是编译时常量。如果必须在设备上调用数学函数以使数组获取其值,我就能理解它。如果是这种情况,我可以制作一个内核来计算这些值,而不用大惊小怪。但是,这种方法对我来说会更方便。有没有什么方法可以在常量内存中声明这些值?您是否看到此方法或代码存在任何其他问题?
答案 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而不是假定的零值。