我正在嘗試編寫一些代碼來將本機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