OpenCL vs OpenMP performance [fermé]

y a-t-il eu des études comparant la performance D'OpenCL à celle d'OpenMP? Plus précisément, je m'intéresse aux frais généraux de lancement de threads avec OpenCL, par exemple, si l'on devait décomposer le domaine en un très grand nombre d'éléments de travail individuels (chacun dirigé par un thread faisant un petit travail) par rapport à des threads plus lourds dans OpenMP où le domaine a été décomposé en sous-domaines dont le nombre est égal au nombre de noyaux.

il semble que le modèle de programmation OpenCL soit plus ciblé vers des puces massivement parallèles (Gpu, par exemple), plutôt que des CPU ayant des noyaux moins nombreux mais plus puissants.

OpenCL peut-il être un remplacement efficace pour OpenMP?

28
demandé sur nbro 2011-09-01 00:46:11

2 réponses

les benchmarks que j'ai vu indiquent Qu'OpenCL et OpenMP tournant sur le même matériel sont généralement comparables en performance, ou OpenMP a légèrement meilleure performance. Cependant, je n'ai vu aucun point de repère que je considérerais comme concluant, parce qu'ils ont été la plupart du temps en manque d'explications détaillées de leur méthodologie. Cependant, il ya quelques choses à considérer:

  • OpenCL aura toujours quelques frais supplémentaires lors de la compilation du noyau à Runtime. Tout benchmark doit soit être listé cette fois séparément, utiliser des noyaux natifs pré-compilés, soit être exécuté assez longtemps pour que la compilation du noyau soit insignifiante.

  • la mise en oeuvre D'OpenCL variera. Les fournisseurs de GPU comme NVidia n'ont aucune raison de s'assurer que leur implémentation OpenCL basée sur CPU est aussi rapide que possible. Aucune des implémentations D'OpenCL n'est susceptible d'être aussi mature qu'une bonne implémentation D'OpenMP.

  • la spécification OpenCL dit essentiellement rien sur la façon dont les implémentations basées sur CPU utilisent le filetage sous le capot, donc toute discussion sur la question de savoir si le filetage est relativement léger ou lourd sera nécessairement spécifique à l'implémentation.

  • lorsque vous utilisez du code OpenCL sur un CPU, vos articles de travail ne doivent pas être minuscules et nombreux. Vous pouvez résoudre le problème de la même manière que vous le feriez pour OpenMP.

même si OpenCL a un peu plus de frais généraux, il peut y avoir d'autres raisons de le préférer.

  • évidemment, si votre code peut faire bon usage D'un GPU, vous voudrez avoir une implémentation OpenCL. Les performances d'OpenCL sur un CPU peuvent être suffisantes pour que cela ne vaille pas la peine de maintenir un chemin de code de repli OpenMP pour les utilisateurs qui n'ont pas de GPUs puissant.

  • une bonne implémentation OpenCL basée sur CPU signifie que vous bénéficierez automatiquement de toutes les extensions D'instruction définies par CPU et OpenCL. l'appui à l'exécution. Avec OpenMP, vous devez faire un travail supplémentaire pour vous assurer que votre exécutable inclut les chemins de code SSEx et AVX.

  • les primitives vectorielles OpenCL peuvent vous aider à exprimer un parallélisme explicite sans les sacrifices de portabilité et de lisibilité que vous obtenez en utilisant les intrinsèques SSE.

24
répondu user57368 2011-08-31 21:44:04

j'ai un programme qui a la possibilité d'utiliser openCL ou openMP sur certains goulots d'étranglement clés, essentiellement en ajoutant des vecteurs et en effectuant des réductions.

dans mon cas, openMP prend 13 secondes où openCL prend 10 Secondes, Sur le CPU. Intel I5.

la configuration la plus rapide pour moi jusqu'à présent est d'ajouter les vecteurs en utilisant openCL GPU, et de faire les réductions sur openMP me faire descendre à 7 secondes. Quand je fais la réduction sur le noyau openCL, sur GPU, il faut un total de 8 secondes.

d'après mon expérience, je dirais que cela dépend peut-être de l'utilisation, et de beaucoup de choses que vous pouvez optimiser votre noyau openCL.

6
répondu MVTC 2012-02-05 20:35:44