我有一个C ++输入,形成一个std :: vector,我想把它传递给我的OpenCL内核(Nvidia平台)。
但是执行以下操作后,我一直遇到分段错误:
queue.enqueueReadBuffer(dev_input, CL_TRUE, 0, sizeof(bool) * input.size(), &input);
因此,我尝试将std::vector<bool>
复制到bool[]
,一切都很完美。但是,将向量转换为C数组(&input[0], input.data())
的常用方法根本不起作用。
您对ReadBuffer或快速分配到C数组有什么建议吗?
谢谢!
答案 0 :(得分:6)
两个问题。
实现可以(可选)优化std::vector<bool>
以提高空间效率,可能通过将值打包到各个内存位中。这与bool
。
您无法传递矢量的地址,就好像它是一个数组一样。
std::vector<bool> input;
queue.enqueueReadBuffer(
dev_input, CL_TRUE, 0,
sizeof(bool) * input.size(), &input);
// ^^^^^^ wrong
如果要将矢量作为指针传递,则必须使用input.data()
或&input[0]
之类的东西。这些不起作用的原因是因为std::vector<bool>
旨在阻止它,因为可能会优化实施(参见第1点)。
这基本上是一个&#34;疣&#34;在C ++库中已经及时完成了。
解决这个问题很痛苦。
// One way to do things...
struct Bool { bool value; }
std::vector<Bool> input;
// Another way to do things...
// (You have to choose the right type here, it depends
// on your platform)
std::vector<int> input;
// Yet another way...
bool *input = new bool[N];
这就是为什么这是一个如此大的臭屁。
答案 1 :(得分:1)
一种可能性是使用copy()
提供的Boost.Compute算法。
基本上,你可以这样做:
// vector of bools on the host
std::vector<bool> host_vec = { ... };
// vector of bools on the device (each represented with a uchar)
boost::compute::vector<uchar_> gpu_vec(host_vec.size(), ctx);
// copy bool values on host to the device
boost::compute::copy(host_vec.begin(), host_vec.end(), gpu_vec.begin(), queue);
Boost.Compute将负责将数据正确复制到计算设备。
答案 2 :(得分:1)
还要补充一点:
OpenCL内核中的bool
类型不保证与任何主机端类型匹配。通常,应避免在主机 - 设备互连中使用布尔类型。