J'ai actuellement un parallèle pour la boucle similaire à celle-ci:
int testValues[16]={5,2,2,10,4,4,2,100,5,2,4,3,29,4,1,52}; parallel_for (1, 100, 1, [&](int i){ int var4; int values[16]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; /* ...nested for loops */ for (var4=0; var4<16; var4++) { if (values[var4] != testValues[var4]) break; } /* ...end nested loops */ }
3 Réponses :
Comme Li-Aung Yip a dit dans des commentaires, le moyen le plus simple d'utiliser un GPU est avec quelque chose comme Matlab prenant en charge les opérations de réseau et automatiquement (plus ou moins) déplace ceux du GPU. Mais pour que cela fonctionne, vous devez réécrire votre code comme des opérations pure matricielle. p>
Sinon, la plupart des utilisations GPU nécessitent toujours le codage dans Cuda ou OpenCl (vous auriez besoin d'utiliser OPENCL avec une carte AMD). Même si vous utilisez une enveloppe pour votre langue préférée, le code réel qui s'exécute sur le GPU est toujours généralement écrit à Opencl (qui a l'air vaguement comme c). et cela nécessite donc une juste quantité d'apprentissage / effort. Vous pouvez commencer par télécharger OPENCL de AMD et lire via les docs ... P>
Ces deux options nécessitent d'apprendre de nouvelles idées, je soupçonne. Ce que vous voulez vraiment, je pense, est un niveau de haut niveau, mais toujours traditionnel, la langue visible au GPU. Malheureusement, ils ne semblent pas exister beaucoup, pourtant. Le seul exemple que je peux penser est theano - vous pourriez essayer cela. Même là-bas, vous devez toujours apprendre Python / Numpy, et je ne suis pas sûr de la manière dont la mise en œuvre de Theano est solide, mais elle peut être la voie la moins pénible (en ce qu'elle permet une approche «traditionnelle» - à l'aide de matrices est à bien des égards. plus facile, mais certaines personnes semblent trouver que très fort à saisir, conceptuellement). P>
PS Ce n'est pas clair pour moi qu'un GPU aidera votre problème, BTW. P>
J'ai décidé d'utiliser Opencl - la courbe d'apprentissage n'est pas trop mauvaise. Je l'ai trouvé plus facile que de lutter avec des bibliothèques qui tentent de convertir le code existant - les quelques emballages que j'ai pu trouver ont échoué assez rapidement et que des techniques de programmation GPU ont de toute façon. Matlab semble soutenir Cuda uniquement pour le moment malheureusement.
OK cool. appelez-vous de c? J'ai constaté que la pyopencl était plus facile que c - vous programmez toujours la partie OPENCL la même, mais il y a moins de travail dans la préparation des données à envoyer. Mais alors je suis plus habitué à python que c ...
Vous voudrez peut-être vérifier le feu de la matrice. p>
http://www.acceleyes.com/products/arrayfire p>
Si vous utilisez OpenCL, vous devez télécharger des implémentations séparées pour différents fournisseurs de périphériques, Intel, AMD et NVIDIA. p>
Vous voudrez peut-être examiner Openacc qui permet le parallélisme via des directives. Vous pouvez porter vos codes (C / C ++ / FORTRAN) aux systèmes hétérogènes tout en maintenant un code source qui fonctionne toujours bien sur un système homogène. Jetez un coup d'œil à cette introduction vidéo . OpenAcc n'est pas une programmation GPU, mais exprimant le parallélisme dans votre code, qui peut être utile pour obtenir des améliorations de performance sans trop de connaissances dans des langages de bas niveau tels que Cuda ou Opencl. OpenAcc est disponible dans les compilateurs commerciaux de PGI, Cray et Caps (PGI propose de nouveaux utilisateurs un essai gratuit de 30 jours). P>
Si votre tâche est une tâche de calcul numérique d'une sorte, ou si vous pouvez le repousser en tant que problème basé sur la matrice, vous pourriez utiliser MATLAB. NOUVEAU MATLABS Prise en charge parallèle pour (
Par Porfor code> dans la boîte à outils de calcul parallèle) et Math Math sur Nvidia Cuda GPU. Les deux sont relativement indolores, ce qui ne nécessite que des modifications modestes du code MATLAB existant.
Quelques informations supplémentaires sur ce que vous essayez de faire ici peuvent être utiles. N'oubliez pas que le transfert de données de la CPU au GPU entraîne une surcharge importante, de sorte que le calcul GPU ne donne qu'une augmentation de la performance si vous faites beaucoup de travaux de calcul par unité de données d'entrée. Calculer le carré de chaque numéro dans un vecteur n'est pas une bonne utilisation de GPGPU (pratiquement aucun travail par unité de données); Le calcul de la FFT d'un vecteur est une bonne utilisation (beaucoup de travail sur peu de données).
J'ai plusieurs boucles imbriquées, dans la boucle la plus interne, j'utilise les indices de boucle pour calculer 16 valeurs et les comparer à la matrice TestValues []. Il ne devrait pas y avoir d'accès important à la mémoire. Aussi, j'utilise une carte AMD / ATI (6850).