我正在尝试编写一些代码来将本机C++类型的数组转换为由OpenCL标准定义的适当大小的向量类型。如何更好地处理依赖于模板参数的类成员类型?
Endian-ness和包装是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;
};
的getDescriptorStruct()
包的方式OpenCL的支持的类型,我可以发送到的OpenCL API与所有字节掉落在正确的地方内核参数。
如果有人正在考虑范式转换,我只需要一次设置整个向量。
链接到OpenCL矢量类型规范。 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/vectorDataTypes.html – NoahR 2012-04-04 01:17:18