Eigen库:将Vector4f的数组传递给OpenCL内核作为浮点数
问题描述:
我有一个需要在CPU上通过矩阵进行转换的向量列表。我将它们存储为一个动态分配的数组(Eigen :: Vector4f *)。一旦它们被转换,我需要在向量上运行OpenCL内核。我想知道什么最好的方法是将这些数据传递到OpenCL,而不必从Eigen :: Vector - > float数组复制数据,因为这样做会相当昂贵。我的理解是,Eigen将矢量值存储在某种可以访问的缓冲区中?Eigen库:将Vector4f的数组传递给OpenCL内核作为浮点数
答
的方法有很多,
1 - 最好的可能是使用一个Matrix4Xf
,因为它允许对整个组向量马上开始工作:
Matrix4Xf vecs(4,n);
Matrix4f transform;
vecs = transform * vecs;
vecs.row(1) // read-write access to all y components
vecs.col(i) // read-write access to i-th vector
float* raw_ptr = vecs.data();
2 - 使用std::vector<Vector4f>
(与Vector4f *相同但没有内存管理问题):
std::vector<Vector4f> vecs(n);
for(auto& v:vecs) v = transform * v;
float* raw_ptr = vecs[0].data(); // assuming vecs is not empty
// you can still see it as Matrix4Xf:
Map<Matrix4Xf> vecs_as_mat(raw_ptr,4,n);
答
好的 - 做了更多的研究。的解决方案是使用由本征::地图类别所提供的原料缓冲器: https://eigen.tuxfamily.org/dox/group__TutorialMapClass.html
我可以创建浮标原始缓冲区然后创建包裹浮缓冲器到载体中的本征::地图对象。