如何调用boost_compute'BOOST_COMPUTE_FUNCTION'定义的函数?
How to call boost_compute 'BOOST_COMPUTE_FUNCTION' defined function?
我目前正在探索 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
);
}
如何调用'add'函数,函数内部的迭代变量是什么?此外,我需要这种代码结构来进行更复杂的计算。
亲切的问候,
托尼
简而言之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);
但还缺少一套价值观...
您的函数可以使用 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);
我目前正在探索 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
);
}
如何调用'add'函数,函数内部的迭代变量是什么?此外,我需要这种代码结构来进行更复杂的计算。
亲切的问候, 托尼
简而言之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);
但还缺少一套价值观...
您的函数可以使用 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);