特征库:将Vector4f的数组作为浮点数传递给OpenCL内核

时间:2017-10-06 04:07:49

标签: opencl eigen

我有一个向量列表,我需要通过CPU上的矩阵进行转换。我将这些存储为动态分配的数组(Eigen :: Vector4f *)。一旦它们被转换,我需要在向量上运行OpenCL内核。我想知道将这些数据传递给OpenCL的最佳方法是什么,而不必复制来自Eigen :: Vector的数据 - >浮点数组,因为这将是相当昂贵的。我的理解是,Eigen在内部将向量值存储在我可以访问的某种缓冲区中吗?

2 个答案:

答案 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);