c++ - 如何调用boost_compute 'BOOST_COMPUTE_FUNCTION'定义的函数?

标签 c++ boost opencl boost-compute

我目前正在探索 boost_compute。不幸的是,文档页面和示例比我需要了解的要少。

给定以下缩小代码:

BOOST_COMPUTE_FUNCTION(bool, add, (int* values, int* results, int constant),
{
    // Whats the indexing variable?
    // In opencl it would be get_global_id(0)
    int index = // ?

    results[index] = values[index] + values[index + 1] + values[index + 2] + constant;
});

void compute(float* results, compute::context* ctx, compute::command_queue* queue)
{
    compute::vector<float> device_values(100, *ctx);
    compute::vector<float> device_results(98, *ctx);

    compute::copy(
        parameters->values.begin(), parameters->values.end(), device_values.begin(), *queue
    );

    // Actual computation
    // HOW TO CALL 'add' for every device_results element?

    compute::copy(
        device_results.begin(), device_results.end(), results, *queue
    );
}

如何调用“添加”函数以及该函数内部的迭代变量是什么?此外,我需要这种代码结构来进行更复杂的计算。

亲切的问候, 托尼

最佳答案

简而言之,boost:compute 函数是不是 OpenCL 内核函数。它们更像是 OpenGL 内核函数。

我认为您的函数需要太多参数,无法与 boost:compute 算法一起使用。
然而,一个稍微简单的函数,只是添加没有常量的相邻值,将是:

BOOST_COMPUTE_FUNCTION(boost::compute::float_, add,
                        (boost::compute::float_ values0, boost::compute::float_ values1),
{
  return values0 + values1;
});

并且可以按照@ddemidov 的建议使用boost::compute::transform 调用:

boost::compute::transform(values.begin(), values.end() -1, // values0
                          values.begin() +1, // values1
                          results.begin(), // results
                          add, queue);

可以使用 boost::compute::lambda 函数来实现您的函数。例如:

using namespace boost::compute::lambda;

float c = 1.234; // some constant

boost::compute::transform(values.begin(), values.end() -1, // values0
                          values.begin() +1, // values1
                          results.begin(), // results
                          _1 + _2 + c, queue);

但还是缺少一套值(value)观……

您的函数可以使用 BOOST_COMPUTE_STRINGIZE_SOURCE 宏编写为 boost:compute 中的 OpenCL 内核:

const char kernel_function_source[] = BOOST_COMPUTE_STRINGIZE_SOURCE(

  kernel void add(global float* values, global float* results, global float* constant)
  {
    size_t index = get_global_id(0);
    results[index] = values[index] + values[index + 1] + values[index + 2] + *constant;
  }

);

构建内核程序并创建内核(使用 boost::compute::program)后,您可以单独设置内核参数并调用 boost::compute::command_queue enqueue_1d_range_kernel 函数:

kernel.set_arg(0, values.get_buffer());
kernel.set_arg(1, results.get_buffer());
kernel.set_arg(2, &constant);
queue.enqueue_1d_range_kernel(kernel, 0, count, 0);

关于c++ - 如何调用boost_compute 'BOOST_COMPUTE_FUNCTION'定义的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41674508/

相关文章:

c++ - 从 yaml 文件读取数据问题 - opencv

C++ boost::interprocess 简单应用

python - 对于多平台 GPGPU 计算,是否有 OpenCL+PyOpenCL 的替代方案?

c++ - 通过转换 OpenCV UMat 的句柄来实例化 OpenCL cl_mem

c++ - 潜在的 dll 兼容性问题的总结?

c++ - 类名后的分号有什么作用?

boost - 尝试将 Ubuntu 10.10 上的 Boost 1.46.1 交叉编译到 Arm Linux

c++ - boost shared_ptr 运算符 =

c++ - OpenCL:如何使用 C++ 包装器检查构建错误

c++ - 从原点找到最近的位置