所以我知道可以在 OpenCL 中使用自定义类型。但我无法将它们与 VexCL 一起使用。创建结构的设备向量工作正常,但我无法执行任何操作。
由于我没有找到任何使用带有 VexCL 的自定义类型的示例,我的问题是这是否可能?提前致谢。
VexCL 不支持开箱即用的结构向量操作。你需要帮助它一点。首先,您需要告诉 VexCL 如何拼写结构的类型名称。假设您在主机端定义了以下结构:
struct point2d {
double x;
double y;
};
您需要提供vex::type_name_impl结构的规范,该结构将生成与结构的类型名称相对应的字符串。请记住,您生成的代码是 C99:
namespace vex {
template <> struct type_name_impl<point2d> {
static std::string get() { return "struct point2d"; }
};
}
您还需要确保每个生成的内核都知道您的结构。这可以在初始化 VexCL 上下文后使用 vex ::push_program_header()函数来实现:
vex::push_program_header(ctx, "struct point2d { double x; double y; };");
这将允许您声明结构的向量,并将向量传递给自定义函数。这应该足够笼统了。这是完整的示例:
#include <vexcl/vexcl.hpp>
// Host-side definition of the struct.
struct point2d {
double x, y;
};
// We need this for code generation.
namespace vex {
template <>
struct type_name_impl<point2d> {
static std::string get() { return "struct point2d"; }
};
}
int main() {
const size_t n = 16;
vex::Context ctx(vex::Filter::Env);
std::cout << ctx << std::endl;
// After this, every kernel will have the struct declaration in header:
vex::push_program_header(ctx, "struct point2d { double x; double y; };");
// Now we may define vectors of the struct:
vex::vector<point2d> x(ctx, n);
vex::vector<double> y(ctx, n);
// We won't be able to use the vectors in any expressions except for
// custom functions, but that should be enough:
VEX_FUNCTION(point2d, init, (double, x)(double, y),
struct point2d p = {x, y}; return p;
);
VEX_FUNCTION(double, dist, (point2d, p),
return sqrt(p.x * p.x + p.y * p.y);
);
x = init(3,4);
y = dist(x);
std::cout << y << std::endl;
}
这是将为 的赋值操作生成的内核y = dist(x);
:
struct point2d { double x; double y; };
double dist
(
struct point2d p
)
{
return sqrt(p.x * p.x + p.y * p.y);
}
kernel void vexcl_vector_kernel
(
ulong n,
global double * prm_1,
global struct point2d * prm_2
)
{
for(ulong idx = get_global_id(0); idx < n; idx += get_global_size(0))
{
prm_1[idx] = dist( prm_2[idx] );
}
}