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