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
0
A
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);
0
Okay - fait un peu plus de recherche. La solution est d'utiliser les tampons premières exposées par la Eigen :: classe Carte: https://eigen.tuxfamily.org/dox/group__TutorialMapClass.html
Je peux créer un tampon brute de flotteurs puis créer Eigen :: objets de la carte qui enveloppent les tampons de flotteur dans des vecteurs.