Question

Je suis expérimenté avec OpenCL pour augmenter la vitesse de notre logiciel. Nous travaillons avec des cartes beaucoup et, pour simplifier, représenter une carte comme std :: vector . L'API OpenCL prend des pointeurs premières de style c comme arguments, par exemple int * dans le cas ci-dessus.

Mes questions:

  • Y at-il des garanties de mise en œuvre dans le stl ce vecteur est, en interne, consécutives en mémoire?
  • Puis-je en toute sécurité jeter un std :: vecteur int * et attendre que travailler?
  • Dans le cas d'un vecteur de vecteurs, je peux supposer encore cela est vrai? Je me attends le vecteur de tenir d'autres données d'état, ou des problèmes d'alignement, ou peut-être autre chose ...
  • Quelle est la meilleure façon d'aborder ce sujet? Ecrire une structure de données 2d personnalisé qui est titulaire d'un interne, le tampon contigu en mémoire et travailler avec cela? Je dois copier / de vecteurs beaucoup ...

Merci.

Était-ce utile?

La solution

  

Y at-il des garanties de mise en œuvre dans le stl ce vecteur est, en interne, consécutive en mémoire?

Au 03 C ++, oui, un vecteur est garanti pour utiliser le stockage contigu. (En C ++ 98, il y avait une échappatoire accidentelle si une mise en œuvre pourrait hypothétiquement utiliser le stockage non contiguës, mais il a été fixé dans la révision 2003 de la norme - et pas mise en œuvre en fait utilisé non contiguës stockage, car ce serait une très mauvaise idée)

  

Puis-je en toute sécurité jeter un std :: vecteur int * et attendre que pour travailler?

La manière habituelle est &v[0]. (&*v.begin() fonctionnerait probablement aussi, mais il me semble rappeler qu'il ya un libellé moelleux dans la norme qui rend ce pas fiable à 100%)

Non. Pourquoi voudriez-vous attendre à ce que de travailler? Un vecteur est une classe. Il est pas un pointeur. Juste contient un pointeur.

  

Dans le cas d'un vecteur de vecteurs, puis je suppose encore cela est vrai? Je me attends le vecteur de tenir d'autres données d'état, ou des problèmes d'alignement, ou peut-être quelque chose d'autre ...

Le vecteur se comporte tout ce que vous entreposer. Si vous faites un vecteur de vecteurs, vous vous retrouvez avec un objet qui contient un pointeur vers un tableau de tas alloué, où chaque élément est un objet qui contient un pointeur vers un tableau de tas alloué.

En ce qui concerne la façon dont vous devriez aborder ce, cela dépend de beaucoup de facteurs. Quelle est la taille de votre ensemble de données total? Vous pouvez avoir toute la table allouée jointive. Avec un vecteur de vecteurs, chaque ligne est une allocation séparée.

Autres conseils

  
      
  • Y at-il des garanties de mise en œuvre dans le stl ce vecteur est,
      intérieurement, consécutive à la mémoire
  •   

Oui, il est un tableau dynamique. garanties standard que les objets à l'intérieur vecteur sont stockés consécutivement.

  
      
  • Puis-je en toute sécurité jeter un std :: vecteur int * et attendre que travailler?
  •   

Non, mais vous pouvez utiliser begin () et l'utiliser comme le pointeur.

  
      
  • Y at-il des garanties de mise en œuvre dans le stl ce vecteur est,
      intérieurement, consécutive à la mémoire
  •   

Non, car vecteur peut contenir certaines variables membres internes l'ensemble tableau 2D ne sera pas emplacement mémoire continuos

  

Y at-il des garanties de mise en œuvre dans le stl ce vecteur est, en interne, consécutive en mémoire?

Bien que je ne peux pas citer les normes ici, je l'ai vu le code dans les bibliothèques de haute qualité en supposant cette mise en page (à savoir, POCO ).

  

Puis-je en toute sécurité jeter un std :: vecteur int * et attendre que pour travailler?

Plus précisément, vous ne pouvez pas refondre le vecteur lui-même. Mais, je l'ai vu le code suivant:

std::vector<int> vec;
int* ptr = &vec[0];
  

Dans le cas d'un vecteur de vecteurs, puis je suppose encore cela est vrai? Je me attends le vecteur de tenir d'autres données d'état, ou des problèmes d'alignement, ou peut-être quelque chose d'autre ...

Vous ne pouvez probablement pas lancer un vecteur de vecteurs à un réseau linéaire. Chaque vecteur réservera sa propre gamme de mémoire et vous ne pouvez pas attendre toutes ces gammes être séquentiel.

Vous avez mentionné dans un commentaire que vous travaillez avec jusqu'à 2500x2500xsizeof (double) données. Dans ce cas, je suggère d'utiliser un vecteur unique au lieu de vecteur de vecteurs. Allouer éléments NxM dans un vecteur et l'envelopper dans une classe d'exposer l'indexation à deux dimensions si vous le souhaitez. Vous obtenez tous les avantages du vecteur avec des frais généraux minimum et toutes vos données sont toujours en mémoire contiguë pour un traitement rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top