2017-10-06 8 views
0

J'ai une liste de vecteurs que j'ai besoin de transformer par des matrices sur la CPU. Je les stocke comme un tableau alloué dynamiquement (Eigen :: Vector4f *). Une fois qu'ils ont été transformés, j'ai besoin d'exécuter un noyau OpenCL sur les vecteurs. Je me demande quel est le meilleur moyen de passer ces données dans OpenCL sans avoir à copier les données de Eigen :: Vector -> float array car cela sera assez coûteux. Ma compréhension est que Eigen stocke en interne les valeurs de vecteurs dans une sorte de tampon que je peux accéder?Bibliothèque propre: passer tableau de Vector4f au noyau OpenCL comme flottants

Répondre

0

Il y a plusieurs façons,

1 - Le mieux est sans doute d'utiliser un Matrix4Xf car elle permet de travailler sur l'ensemble des vecteurs à la fois:

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 - utiliser un std::vector<Vector4f> (même que Vector4f * mais aucun problème de gestion de la mémoire):

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