通过引用将自定义结构的向量传递给 boost::compute 闭包或函数
Pass a vector of custom structs by reference to a boost::compute closure or function
我对opencl有点陌生,正在尝试学习正确使用boost::compute。请考虑以下代码:
#include <iostream>
#include <vector>
#include <boost/compute.hpp>
const cl_int cell_U_size{ 4 };
#pragma pack (push,1)
struct Cell
{
cl_double U[cell_U_size];
};
#pragma pack (pop)
BOOST_COMPUTE_ADAPT_STRUCT(Cell, Cell, (U));
int main(int argc, char* argv[])
{
using namespace boost;
auto device = compute::system::default_device();
auto context = compute::context(device);
auto queue = compute::command_queue(context, device);
std::vector<Cell> host_Cells;
host_Cells.reserve(10);
for (auto j = 0; j < host_Cells.capacity(); ++j) {
host_Cells.emplace_back(Cell());
for (auto i = 0; i < cell_U_size; ++i) {
host_Cells.back().U[i] = static_cast<cl_double>(i+j);
}
}
std::cout << "Before:n";
for (auto const& hc : host_Cells) {
for (auto const& u : hc.U)
std::cout << " " << u;
std::cout << "n";
}
compute::vector<Cell> device_Cells(host_Cells.size(), context);
auto f = compute::copy_async(host_Cells.begin(), host_Cells.end(), device_Cells.begin(), queue);
try {
BOOST_COMPUTE_CLOSURE(Cell, Step1, (Cell cell), (cell_U_size), {
for (int i = 0; i < cell_U_size; ++i) {
cell.U[i] += 1.0;
}
return cell;
});
f.wait(); // Wait for data to finish being copied
compute::transform(device_Cells.begin(), device_Cells.end(), device_Cells.begin(), Step1, queue);
//BOOST_COMPUTE_CLOSURE(void, Step2, (Cell &cell), (cell_U_size), {
// for (int i = 0; i < cell_U_size; ++i) {
// cell.U[i] += 1.0;
// }
//});
//compute::for_each(device_Cells.begin(), device_Cells.end(), Step2, queue);
compute::copy(device_Cells.begin(), device_Cells.end(), host_Cells.begin(), queue);
}
catch (std::exception &e) {
std::cout << e.what() << std::endl;
throw;
}
std::cout << "After:n";
for (auto const& hc : host_Cells) {
for (auto const& u : hc.U)
std::cout << " " << u;
std::cout << "n";
}
}
我有一个自定义结构的向量(实际上比这里显示的要复杂得多(,我想在 GPU 上处理。在未注释的BOOST_COMPUTE_CLOSURE中,compute::transform
按值传递结构,处理它们,然后将它们复制回来。
我想通过引用传递这些,如注释掉的BOOST_COMPUTE_CLOSURE所示,compute::for_each
,但是当程序运行时内核无法编译(Build Program Failure
(,我没有找到任何文档提到应该如何实现这一点。
我知道我可以通过使用 BOOST_COMPUTE_STRINGIZE_SOURCE
并将指针传递给整个结构向量来实现引用传递(实际上是指针,因为它是 C99(,但我想使用 compute::...
函数,因为它们看起来更优雅。
如果定义宏BOOST_COMPUTE_DEBUG_KERNEL_COMPILATION
并且构建 OpenCL 程序失败,则程序源代码和构建日志将写入 stdout。
您不能在 OpenCL C 中通过引用传递,您尝试在 BOOST_COMPUTE_CLOSURE
中执行此操作。我知道您希望将__global
指针传递给您的闭包并修改全局内存中变量的值,而不是该值的本地副本。我不认为它在Boost.Compute中得到支持,因为在for_each
(和其他算法(中,Boost.Compute总是将值传递给你的函数/闭包。
当然,您始终可以实现解决方法 - 添加一元运算符&
或实现自定义设备迭代器。但是,在所呈现的示例中,它只会降低性能,因为它会导致非合并的内存读取和写入。如果你有非常复杂的结构数组(AoS(,试着改变数组的结构(SoA(或/和破坏你的结构。
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- Generate boost::uuids::uuid from boost::compute::detail::sha
- 在 boost::compute 中分配大向量
- 通过引用将自定义结构的向量传递给 boost::compute 闭包或函数
- OPENCL:可以将模板对象作为内核参数,并使用boost :: Compute
- boost::compute,将指针传递给闭包
- 使用zip迭代器调用boost::compute::sort()会导致构建错误
- 性能:boost.compute vs . opencl c++包装器
- 是否boost::compute支持const修饰符