【发布时间】:2012-04-03 23:52:54
【问题描述】:
我正在尝试编写一些代码来将原生 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;
};
getDescriptorStruct() 打包 OpenCL 支持的类型,我可以将其作为内核参数发送到 OpenCL API,所有字节都在正确的位置。
如果有人正在考虑范式转换,我只需要一次设置整个向量。
【问题讨论】:
-
链接到 OpenCL 矢量类型规范。 khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/…
标签: c++ templates opencl specialization