我有一个向量列表,我需要通过CPU上的矩阵进行转换。我将这些存储为动态分配的数组(Eigen :: Vector4f *)。一旦它们被转换,我需要在向量上运行OpenCL内核。我想知道将这些数据传递给OpenCL的最佳方法是什么,而不必复制来自Eigen :: Vector的数据 - >浮点数组,因为这将是相当昂贵的。我的理解是,Eigen在内部将向量值存储在我可以访问的某种缓冲区中吗?
答案 0 :(得分:0)
好的 - 做了一些研究。解决方案是使用Eigen :: Map类公开的原始缓冲区: https://eigen.tuxfamily.org/dox/group__TutorialMapClass.html
我可以创建一个浮点数的原始缓冲区,然后创建Eigen :: Map对象,将浮点缓冲区包装成向量。
答案 1 :(得分:0)
有很多方法,
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);