2017-10-06 10 views
0

Ich habe eine Liste von Vektoren, die ich durch Matrizen auf der CPU transformieren muss. Ich speichere diese als dynamisch zugewiesenes Array (Eigen :: Vector4f *). Sobald sie transformiert wurden, muss ich einen OpenCL-Kernel auf den Vektoren ausführen. Ich frage mich, was der beste Weg ist, diese Daten in OpenCL zu übergeben, ohne die Daten aus Eigen :: Vector -> float array kopieren zu müssen, da dies ziemlich teuer ist. Meines Wissens nach speichert Eigen die Vektorenwerte intern in einer Art Puffer, auf den ich zugreifen kann.Eigen-Bibliothek: übergeben Array von Vector4f zu OpenCL Kernel als Schwimmer

Antwort

0

Es gibt viele Möglichkeiten,

1 - Die besten wahrscheinlich ein Matrix4Xf verwenden, weil es auf dem ganzen Satz von Vektoren auf einmal arbeiten kann:

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 - verwendet ein std::vector<Vector4f> (wie Vector4f *, aber keine Speicherverwaltungsprobleme):

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