我正在尝试编写一些代码来将原生 C++ 类型的数组转换为 OpenCL 标准定义的适当大小的向量类型。
字节序和打包是特定于 OpenCL 实现的。OpenCL 类型不提供方便的运算符[]。(实际上 API 是 C )另一个问题:cl_int4
有一个.s3
成员,但cl_int2
没有。
我有一些在功能上可以工作的东西,但你可以看到我已经进入了模板疯狂的领域。
这可以以更好的方式完成吗? 这些函数不会经常被调用,所以最好是减少程序二进制大小和更少冗长的源代码的组合。
这是我到目前为止所得到的。我没有向您展示所有维度的特化(省略 3-6),而且我也想至少实现整数类型。
#include <CL/cl.h>
template < typename HOST_T, int NUM_DIM >
struct Payload_t;
// Vector length needs to be (for dims 1-6): 2, 4, 8, 8, 16, 16
//single precision
template < >
struct __attribute__((packed)) Payload_t <float, 1> {
cl_float2 vec;
void setElement( int pos, float value )
{
switch (pos) {
case 0: vec.s0 = value; return;
case 1: vec.s1 = value; return;
default: return;
}
}
};
template < >
struct __attribute__((packed)) Payload_t <float, 2> {
cl_float4 vec;
void setElement( int pos, float value )
{
switch (pos) {
case 0: vec.s0 = value; return;
case 1: vec.s1 = value; return;
case 2: vec.s2 = value; return;
case 3: vec.s3 = value; return;
default: return;
}
}
};
/// double-precision
template < >
struct __attribute__((packed)) Payload_t <double, 1> {
cl_double2 vec;
void setElement( int pos, double value )
{
switch (pos) {
case 0: vec.s0 = value; return;
case 1: vec.s1 = value; return;
default: return;
}
}
};
template < >
struct __attribute__((packed)) Payload_t <double, 2> {
cl_double4 vec;
void setElement( int pos, double value )
{
switch (pos) {
case 0: vec.s0 = value; return;
case 1: vec.s1 = value; return;
case 2: vec.s2 = value; return;
case 3: vec.s3 = value; return;
default: return;
}
}
};
我想你可能会好奇我会如何使用这个类。在一个示例中,我有一个以 REAL 类型为模板的类,该类具有以下成员类的实例,其中包含Payload_t
.
template <int NUM_DIM >
struct cartesian_box_descriptor_t : cartesian_box_descriptor_base_t
{
static const int vectorLengthArray[6];
void set_dx( REAL * dx_vec )
{
for (int i = 0; i < NUM_DIM; ++i)
payload.setElement( i, dx_vec[i] );
};
void set_startx( REAL * startx_vec )
{
for (int i = 0; i < NUM_DIM; ++i)
payload.setElement( NUM_DIM + i , startx_vec[i] );
};
virtual WxAny getDescriptorStruct() const
{
return WxAny( payload ); // packages this simple structure as 'scalar' with hidden type
};
Payload_t< REAL, NUM_DIM> payload;
};
封装 OpenCL 支持的getDescriptorStruct()
类型,我可以将其作为内核参数发送到 OpenCL API,所有字节都位于正确的位置。
如果有人正在考虑范式转变,我只需要一次设置整个向量。