2011-03-03 5 views
0

Je suis actuellement impliqué dans le développement d'un grand projet de calcul scientifique, et j'explore la possibilité d'accélération matérielle avec les GPU comme alternative à l'approche MPI/cluster. Nous sommes dans une situation principalement liée à la mémoire, avec trop de données à mettre en mémoire pour tenir sur un GPU. À cette fin, j'ai deux questions:Accès GPU au système RAM

1) Les livres que j'ai lus disent qu'il est illégal d'accéder à la mémoire sur l'hôte avec un pointeur sur l'appareil (pour des raisons évidentes). Au lieu de cela, il faut copier la mémoire de la mémoire de l'hôte vers la mémoire de l'appareil, puis effectuer les calculs, puis recopier. Ma question est de savoir s'il existe un moyen de contourner ce problème. Y a-t-il un moyen de lire une valeur dans la RAM du système à partir du GPU?

2) Plus généralement, quels algorithmes/solutions existent pour optimiser le transfert de données entre la CPU et le GPU lors de calculs liés à la mémoire tels que ceux-ci?

Merci pour votre aide dans cette! Je suis enthousiaste à l'idée de passer à CUDA, simplement parce que la parallélisation est beaucoup plus intuitive!

+0

consultez http://stackoverflow.com/questions/5007556/cuda-zero-copy-memory-considerations/5011564#5011564 –

Répondre

3

1) Oui, vous pouvez le faire avec la plupart des paquets GPGPU.

Celui avec lequel je suis le plus familier - AMD Stream SDK vous permet d'allouer un tampon dans la mémoire "système" et de l'utiliser comme une texture lue ou écrite par votre noyau. Cuda et OpenCL ont la même capacité, la clé est de définir les bons indicateurs sur l'allocation de tampon.

MAIS ...

  • Vous ne voulez pas le faire parce que les données sont lues/écrites sur le bus PCIe, qui a beaucoup de frais généraux.

  • L'implémentation est libre d'interpréter vos requêtes de façon libérale. Je veux dire que vous pouvez dire pour localiser la mémoire tampon dans la mémoire système, mais la pile logicielle est libre de faire des choses comme le transférer dans la mémoire du GPU à la volée - tant que les résultats calculés sont les mêmes

2) Tous les principaux environnements logiciels GPGPU (Cuda, OpenCL, Stream SDK) prennent en charge les transferts DMA, ce que vous voulez probablement.

0

Même si pouvait, vous ne le feriez probablement pas, car les transferts sur PCI ont tendance à être un goulot d'étranglement, alors que la bande passante entre le GPU et sa propre mémoire est généralement très élevée. Cela dit, si vous avez relativement peu de calculs à effectuer par élément sur un grand ensemble de données, alors GPGPU ne fonctionnera probablement pas bien pour vous de toute façon.

+0

Eh bien, cela peut être possible avec PCIe 3.0 et les cartes mères haut de gamme. Je ne comprends pas pourquoi il n'y a pas de support pour les calculs qui nécessitent> 4 Go de mémoire! – omellette

0

Je suggère un guide de programmation cuda. vous y trouverez de nombreuses réponses. Recherche des flux, adressage unifié, cudaHostRegister.

Questions connexes