2013-07-10 9 views
1

Existe-t-il un moyen de convertir un vecteur 2D en tableau pour pouvoir l'utiliser dans les noyaux CUDA?std :: vectoriser dans CUDA

Il est déclaré que:

vector<vector<int>> information; 

Je veux cudaMalloc et copie de l'hôte à l'appareil, ce qui serait la meilleure façon de le faire?

int *d_information; 
cudaMalloc((void**)&d_information, sizeof(int)*size); 
cudaMemcpy(d_information, information, sizeof(int)*size, cudaMemcpyHostToDevice); 

Répondre

2

En un mot, non il n'y en a pas. L'API CUDA ne prend pas en charge la copie en profondeur et ne sait rien non plus sur std::vector. Si vous insistez pour avoir un vecteur de vecteurs comme source hôte, il faudra faire quelque chose comme ceci:

int *d_information; 
cudaMalloc((void**)&d_information, sizeof(int)*size); 

int *dst = d_information; 
for (std::vector<std::vector<int> >::iterator it = information.begin() ; it != information.end(); ++it) { 
    int *src = &((*it)[0]); 
    size _t sz = it->size(); 

    cudaMemcpy(dst, src, sizeof(int)*sz, cudaMemcpyHostToDevice); 
    dst += sz; 
} 

[disclaimer: écrit dans le navigateur, compilé ou non testé. Utilisation à vos risques et périls]

Ceci copiera la mémoire de l'hôte dans une allocation dans la mémoire linéaire GPU, nécessitant une copie pour chaque vecteur. Si le vecteur des vecteurs est un tableau "en dents de scie", vous voudrez stocker une indexation que le GPU utilisera également.

+0

Ok, donc pas moyen d'avoir std :: vector dans CUDA. Serait-il utile (et facile) d'utiliser Thrust? Je ne l'ai jamais utilisé auparavant, mais pour autant que je l'ai lu, il est en quelque sorte similaire à la bibliothèque STL mais dans CUDA. Un conseil? – BRabbit27

+1

Non, la poussée n'a aucun support pour cela non plus. Vous feriez mieux de simplement aplatir votre tableau hôte dans un 'std :: vector ' et de l'indexer comme vous le feriez avec de la mémoire linéaire sur le périphérique. – talonmies

+0

@ BRabbit27: Je ne sais pas pourquoi votre modification a été rejetée, c'était correct. J'ai déconnecté ce code dans le navigateur et quand j'ai mis cet avertissement, je le pense vraiment. – talonmies

2

Pour autant que je comprends, le vecteur de vecteurs ne ont pas besoin de résider dans une mémoire contiguë, à savoir ils peuvent être fragmentés.

En fonction de la quantité de mémoire dont vous avez besoin de transférer je ferais une des deux questions:

  1. ReOrder votre mémoire à un seul vecteur, puis utilisez votre cudaMemcpy.
  2. Créez une série de cudaMemcpyAsync, où chaque copie gère un vecteur unique dans votre vecteur de vecteurs, puis synchronisez.