2010-05-19 4 views
6

d'abord:Quel genre de benifits de travail de OpenCL

  • Je suis bien conscient que OpenCL n'a pas fait comme par magie tout plus vite
  • Je suis bien conscient que OpenCL a des limites

Alors maintenant à ma question, je suis habitué à faire différents calculs scientifiques en utilisant la programmation. Certaines des choses avec lesquelles je travaille sont assez intenses en ce qui concerne la complexité et le nombre de calculs. Donc, je me demandais, peut-être que je pourrais accélérer les choses bu en utilisant OpenCL.

Alors, ce que j'aimerais entendre de vous tous est des réponses à certains des éléments suivants [bonus pour les liens]:

* Quel genre de calculs/algorithmes/problèmes généraux convient à OpenCL

* Quelles sont les directives générales pour déterminer si un code particulier pourrait bénéficier de la migration vers OpenCL?

Cordialement

Répondre

9

Je pense que c'est une bonne question, et c'est quelque chose que j'essaie de mettre au point pour mes propres recherches. Il existe actuellement de fortes limitations en ce qui concerne ce que les GPU peuvent faire, car ils nécessitent des threads individuels pour exécuter exactement le même code sur différents ensembles de données, à savoir le problème/algorithme doit être "data parallel". Il est évident que les problèmes de données parallèles incluent les simulations de Monte Carlo (où de nombreuses simulations MC sont exécutées en parallèle), le traitement d'image et, de façon moins évidente, les simulations de dynamique moléculaire. L'intégration numérique (Monte Carlo ou autre) est une autre application scientifique qui peut être facilement portée sur un GPU.

L'autre restriction principale est que la mémoire par thread est très limitée, et donc pour être exécuté efficacement sur un GPU, l'algorithme doit avoir une intensité arithmétique élevée. Une condition nécessaire mais non suffisante pour qu'un algorithme soit candidat à l'exécution sur un GPU est que sur l'UC, l'algorithme doit être fortement lié à l'UC plutôt que lié à la mémoire. Mon point de vue est que, avec le temps, de plus en plus de problèmes seront résolus afin qu'ils puissent être résolus en utilisant ce paradigme simplement parce qu'il y a un gain de performance aussi grand, mais les fruits les plus bas sont évidemment problèmes parallèles de données. À mon avis, la programmation massivement multicœur sera de plus en plus importante et importante dans les milieux scientifiques au cours de la prochaine décennie.

J'ai joué un peu avec ça un peu, et j'ai réussi à créer un problème de backtracking dans un format approprié pour l'exécution sur un GPU (en utilisant CUDA). Pour info, je décris ceci dans une conférence: http://lattice.complex.unimelb.edu.au/home/sites/default/files/mydocuments/clisby_cuda0509.pdf

3

Il est bien adapté aux tâches qui peuvent être exprimées sous la forme d'un programme un peu petit travail en parallèle sur de gros morceaux de structures de données simples.

Si vous voulez calculer la différence entre deux images, OpenCL est fait pour vous. Si vous voulez ray-tracer une scène, c'est un peu difficile mais tout de même faisable. Si vous avez répondu à de grandes quantités de demandes de service Web, OpenCL n'est pas la solution.

2

En ce qui concerne les algorithmes, ils doivent être parallèles. C'est un ensemble de données ne devrait pas avoir de dépendances sur les ensembles précédents. Pour faire une analogie, pensez au tri par insertion où un élément est comparé à d'autres éléments pour trouver sa place.Ce sont des données "non" parallèles car chaque étape doit accéder aux éléments N-1. Maintenant, si vous avez besoin de trier en utilisant openCL, vous devrez implémenter le tri bitonique qui est un type de réseau de tri.

Même s'il s'agit de données parallèles, il y a la question du compromis entre les FLOPS et les latences de mémoire. Si chaque donnée doit être extraite de la mémoire globale, l'amélioration des performances peut ne pas être significative. Les latences de mémoire du GPU sont beaucoup plus élevées que celles du CPU. Pour contrer cela, il existe des mémoires locales en GPU qui peuvent être utilisées.

Questions connexes