我正在尝试使用带有boost :: compute的OPENCL将RGBA数组转换为灰度。转换发生,一切正常。问题是我必须将设备向量复制到主机上,并且在主机再次转换为数组之后。
我想直接从设备复制到主机,而无需两个复制功能(这使算法非常慢)
遵循我创建的功能:
void ToGreyScale(vector<unsigned char>& data) {
using compute::uchar4_;
// create vector for points
compute::vector<uchar4_> vector(data.size() / 4,context);
// copy point data to the device
compute::copy(
reinterpret_cast<uchar4_*>(&data[0]),
reinterpret_cast<uchar4_*>(&data[0]) + data.size()/4,
vector.begin(),
queue
);
BOOST_COMPUTE_FUNCTION(uchar4_, to_grey, (uchar4_ x),
{
int grey = x.x * 0.114 + x.y * 0.587 + x.z * 0.299;
x.x = grey;
x.y = grey ;
x.z = grey;
return x;
});
boost::compute::transform(vector.begin(), vector.end(), vector.begin(), to_grey, queue);
///////////////////////////////////////
///I want to optimize this part
///////////////////////////////////////
std::vector<uchar4_> out(vector.size());
compute::copy(
vector.begin(),
vector.end(),
out.begin(),
queue
);
copy(
reinterpret_cast<unsigned char*>(&out.front()),
reinterpret_cast<unsigned char*>(&out.front()) + data.size(),
data.begin()
);
/////////////////////////////////////////////////////
}
如果有任何方法不需要我知道的uchar4_转换为灰度(会更容易)