2017-10-06 5 views
0

私はCPU上の行列で変換する必要があるベクトルのリストを持っています。私は動的に割り当てられた配列(Eigen :: Vector4f *)としてこれらを格納しています。それらが変換されたら、私はベクトル上でOpenCLカーネルを実行する必要があります。私はEigen :: Vector - > float配列からデータをコピーすることなく、このデータをOpenCLに渡すのが最善の方法であると思っています。これはかなりコストがかかるためです。私の理解では、Eigenは内部的にベクトル値を何らかのバッファに格納しています。固有ライブラリ:Vector4fの配列を浮動小数点数としてOpenCLカーネルに渡す

答えて

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); 
0

もう少し研究を行いました。解決方法は、Eigen :: Mapクラスで公開されている生のバッファを使用することです:floatの生のバッファを作成し、浮動バッファをベクトルにラップするEigen :: Mapオブジェクトを作成できます。

関連する問題