GPU Computing - Pourquoi, quand et comment. Plus quelques tests

Tout le monde sait depuis longtemps que sur les cartes vidĂ©o, vous pouvez non seulement jouer Ă  des jouets, mais aussi effectuer des choses qui ne sont pas liĂ©es aux jeux, par exemple, former un rĂ©seau de neurones, vous souvenir de la crypto-monnaie ou effectuer des calculs scientifiques. Comment cela s'est passĂ©, vous pouvez le lire ici , mais je voulais aborder la question de savoir pourquoi le GPU peut ĂȘtre intĂ©ressant pour le programmeur moyen (non liĂ© Ă  GameDev) comment aborder le dĂ©veloppement sur le GPU sans y consacrer beaucoup de temps, dĂ©cider si regardez dans cette direction, et " dĂ©terminez sur vos doigts" quel profit vous pouvez obtenir. 



L'article a Ă©tĂ© Ă©crit sur la base de ma prĂ©sentation en HighLoad ++. Il aborde principalement les technologies proposĂ©es par NVIDIA. Je n'ai aucun but de faire la publicitĂ© de produits, je les donne simplement Ă  titre d'exemple, et Ă  coup sĂ»r, quelque chose de similaire peut ĂȘtre trouvĂ© chez les fabricants concurrents.

Pourquoi compter sur le GPU?


Deux processeurs peuvent ĂȘtre comparĂ©s selon diffĂ©rents critĂšres, les plus populaires Ă©tant probablement la frĂ©quence et le nombre de cƓurs, la taille des caches, etc., mais au final, nous nous intĂ©ressons au nombre d'opĂ©rations qu'un processeur peut effectuer par unitĂ© de temps, de quel type d'opĂ©ration il s'agit, mais une question distincte Une mĂ©trique commune est le nombre d'opĂ©rations en virgule flottante par seconde - flops. Et lorsque nous voulons comparer le chaud au doux, et dans notre cas le GPU avec le CPU, cette mĂ©trique est trĂšs pratique.

Le graphique ci-dessous montre la croissance de ces mĂȘmes flops au fil du temps pour les processeurs et les cartes vidĂ©o.


(Les données sont collectées à partir de sources ouvertes, il n'y a pas de données pour 2019-20 ans, car tout n'est pas si beau là-bas, mais les GPU gagnent toujours)

Eh bien, c'est tentant, n'est-ce pas? Nous déplaçons tous les calculs du CPU vers le GPU et obtenons huit fois les meilleures performances!

Mais, bien sûr, tout n'est pas si simple. Vous ne pouvez pas tout prendre et tout transférer sur le GPU, pourquoi, nous parlerons plus loin.

Architecture GPU et sa comparaison avec le CPU


J'apporte à beaucoup une image familiÚre de l'architecture du CPU et des éléments de base:


CPU Core

Qu'est-ce qui est si spĂ©cial? Un cƓur et un tas de blocs auxiliaires.

Voyons maintenant l'architecture GPU:


GPU Core

Une carte vidĂ©o a beaucoup de cƓurs de traitement, gĂ©nĂ©ralement plusieurs milliers, mais ils sont combinĂ©s en blocs; pour les cartes vidĂ©o NVIDIA, gĂ©nĂ©ralement 32 chacune, et ont des Ă©lĂ©ments communs, y compris et registres. L'architecture du noyau GPU et des Ă©lĂ©ments logiques est beaucoup plus simple que sur le CPU, Ă  savoir, il n'y a pas de prefetchers, de prĂ©dicteurs de brunch et bien plus encore.

Eh bien, ce sont les points clés de la différence dans l'architecture du CPU et du GPU, et, en fait, ils imposent des restrictions ou, inversement, ouvrent les possibilités de ce que nous pouvons lire efficacement sur le GPU.

Je n'ai pas mentionnĂ© un autre point important, gĂ©nĂ©ralement la carte vidĂ©o et le processeur ne «fouinent» pas entre eux et n'Ă©crivent pas de donnĂ©es sur la carte vidĂ©o et ne lisent pas le rĂ©sultat - ce sont des opĂ©rations distinctes et peuvent se rĂ©vĂ©ler ĂȘtre un «goulot d'Ă©tranglement» dans votre systĂšme, un graphique du temps de pompage par rapport Ă  la taille les donnĂ©es sont donnĂ©es plus loin dans l'article.

Limitations et fonctionnalités du GPU


Quelles limitations cette architecture impose-t-elle aux algorithmes exécutables:

  • Si nous calculons sur un GPU, alors nous ne pouvons pas sĂ©lectionner un seul cƓur, un bloc entier de cƓurs sera allouĂ© (32 pour NVIDIA).
  • Tous les cƓurs exĂ©cutent les mĂȘmes instructions, mais avec des donnĂ©es diffĂ©rentes (nous en parlerons plus tard), ces calculs sont appelĂ©s Single-Instruction-Multiple-Data ou SIMD (bien que NVIDIA introduise son raffinement). 
  • En raison de l'ensemble relativement simple de blocs logiques et de registres gĂ©nĂ©raux, le GPU n'aime vraiment pas la ramification, et en fait la logique complexe dans les algorithmes.

Quelles opportunités ouvre-t-il:

  • En fait, l'accĂ©lĂ©ration de ces mĂȘmes calculs SIMD. L'exemple le plus simple est l'ajout Ă©lĂ©mentaire de matrices, et analysons-le.

Réduction des algorithmes classiques à la représentation SIMD


Transformation


Nous avons deux tableaux, A et B, et nous voulons ajouter un élément du tableau B à chaque élément du tableau A. Ci-dessous est un exemple en C, bien que j'espÚre qu'il sera clair pour ceux qui ne parlent pas ce langage:

void func(float *A, float *B, size)
{ 
   for (int i = 0; i < size; i++) 
   { 
       A[i] += B[i]
   } 
}

Bouclage classique des éléments dans une boucle et exécution linéaire.

Voyons maintenant Ă  quoi ressemblera ce code pour le GPU:

void func(float *A, float *B, size) 
{ 
   int i = threadIdx.x; 
   if (i < size) 
      A[i] += B[i] 
}

Et ici, c'est déjà intéressant, la variable threadIdx est apparue, que nous ne semblions déclarer nulle part. Oui, son systÚme nous fournit. Imaginez que dans l'exemple précédent, le tableau se compose de trois éléments et que vous souhaitez l'exécuter dans trois threads parallÚles. Pour ce faire, vous devez ajouter un autre paramÚtre - le numéro d'index ou de flux. C'est ce que la carte vidéo fait pour nous, bien qu'elle passe l'index en tant que variable statique et peut fonctionner avec plusieurs dimensions à la fois - x, y, z.

Autre nuance, si vous souhaitez dĂ©marrer un grand nombre de flux parallĂšles Ă  la fois, les flux devront ĂȘtre divisĂ©s en blocs (une caractĂ©ristique architecturale des cartes vidĂ©o). La taille de bloc maximale dĂ©pend de la carte vidĂ©o, et l'indice de l'Ă©lĂ©ment pour lequel nous effectuons les calculs devra ĂȘtre obtenu comme suit:

int i = blockIdx.x * blockDim.x + threadIdx.x; // blockIdx –  , blockDim –  , threadIdx –    

En consĂ©quence, ce que nous avons: beaucoup de threads exĂ©cutĂ©s en parallĂšle qui exĂ©cutent le mĂȘme code, mais avec des indices diffĂ©rents, et, par consĂ©quent, des donnĂ©es, c'est-Ă -dire le mĂȘme SIMD.

C'est l'exemple le plus simple, mais si vous souhaitez travailler avec le GPU, vous devez amener votre tĂąche sous la mĂȘme forme. Malheureusement, ce n'est pas toujours possible et dans certains cas peut faire l'objet d'une thĂšse de doctorat, mais nĂ©anmoins, les algorithmes classiques peuvent encore ĂȘtre amenĂ©s Ă  cette forme.

Agrégation


Voyons maintenant à quoi ressemblera l'agrégation castée en représentation SIMD:
 

Nous avons un tableau de n Ă©lĂ©ments. À la premiĂšre Ă©tape, nous dĂ©marrons n / 2 threads et chaque thread ajoute deux Ă©lĂ©ments, Ă  savoir en une seule itĂ©ration, nous additionnons la moitiĂ© des Ă©lĂ©ments du tableau. Et puis dans la boucle, nous rĂ©pĂ©tons la mĂȘme chose pour le tableau nouvellement crĂ©Ă©, jusqu'Ă  ce que nous agrĂ©gions les deux derniers Ă©lĂ©ments. Comme vous pouvez le voir, plus la taille du tableau est petite, moins nous pouvons dĂ©marrer de threads parallĂšles, c'est-Ă -dire sur un GPU, il est logique d'agrĂ©ger des tableaux d'une taille suffisamment grande. Un tel algorithme peut ĂȘtre utilisĂ© pour calculer la somme des Ă©lĂ©ments (en passant, n'oubliez pas le dĂ©bordement possible du type de donnĂ©es avec lequel vous travaillez), rechercher le maximum, le minimum ou simplement la recherche.

Tri


Mais le tri semble déjà beaucoup plus compliqué.

Les deux algorithmes de tri les plus populaires sur le GPU sont:

  • Tri bitonique
  • Radix-sort

Mais radix-sort est toujours utilisĂ© plus souvent, et une implĂ©mentation prĂȘte pour la production peut ĂȘtre trouvĂ©e dans certaines bibliothĂšques. Je n'analyserai pas en dĂ©tail le fonctionnement de ces algorithmes; ceux qui sont intĂ©ressĂ©s peuvent trouver une description de radix-sort sur https://www.codeproject.com/Articles/543451/Parallel-Radix-Sort-on-the-GPU-using-Cplusplus- AMP et https://stackoverflow.com/a/26229897

Mais l'idĂ©e est que mĂȘme un algorithme non linĂ©aire tel que le tri peut ĂȘtre rĂ©duit Ă  une vue SIMD.

Et maintenant, avant de regarder les vrais chiffres qui peuvent ĂȘtre obtenus Ă  partir du GPU, essayons de comprendre comment programmer pour ce miracle de la technologie?

OĂč commencer


Les deux technologies les plus courantes pouvant ĂȘtre utilisĂ©es pour la programmation sous le GPU:

  • Opencl
  • Cuda

OpenCL est une norme prise en charge par la plupart des fabricants de cartes vidĂ©o, notamment et sur les appareils mobiles, le code Ă©crit en OpenCL peut Ă©galement ĂȘtre exĂ©cutĂ© sur le CPU.

Vous pouvez utiliser OpenCL Ă  partir de C / C ++, il existe des liants vers d'autres langages.

Pour OpenCL, j'ai le plus apprécié le livre OpenCL en action . Il décrit également différents algorithmes sur le GPU, notamment Tri bitonique et tri Radix.

CUDA est la technologie et le SDK exclusifs de NVIDIA. Vous pouvez Ă©crire en C / C ++ ou utiliser des liaisons vers d'autres langages.

Comparer OpenCL et CUDA n'est pas correct, car l'un est la norme, l'autre est l'ensemble du SDK. Néanmoins, beaucoup de gens choisissent CUDA pour le développement de cartes vidéo, malgré le fait que la technologie est propriétaire, bien que gratuite et ne fonctionne que sur les cartes NVIDIA. Il y a plusieurs raisons à cela:

  • API
  • , GPU, (host)
  • , ..

Les particularités incluent le fait que CUDA est livré avec son propre compilateur, qui peut également compiler du code C / C ++ standard.

Le livre CUDA le plus complet que j'ai rencontré était Professional CUDA C Programming , bien qu'il soit déjà un peu dépassé, il aborde néanmoins de nombreuses nuances techniques de programmation pour les cartes NVIDIA.

Mais que faire si je ne veux pas passer quelques mois Ă  lire ces livres, Ă©crire mon propre programme pour une carte vidĂ©o, tester et dĂ©boguer, puis dĂ©couvrir que ce n'est pas pour moi? 

Comme je l'ai dit, il existe un grand nombre de bibliothĂšques qui cachent la complexitĂ© du dĂ©veloppement sous le GPU: XGBoost, cuBLAS, TensorFlow, PyTorch et autres, nous considĂ©rerons la bibliothĂšque de poussĂ©e, car il est moins spĂ©cialisĂ© que les autres bibliothĂšques ci-dessus, mais en mĂȘme temps il implĂ©mente des algorithmes de base, par exemple, le tri, la recherche, l'agrĂ©gation et, avec une forte probabilitĂ©, il peut ĂȘtre applicable Ă  vos tĂąches.

Thrust est une bibliothÚque C ++ qui vise à "remplacer" les algorithmes STL standard par des algorithmes basés sur GPU. Par exemple, le tri d'un tableau de nombres à l'aide de cette bibliothÚque sur une carte vidéo ressemblerait à ceci:

thrust::host_vector<DataType> h_vec(size); //    
std::generate(h_vec.begin(), h_vec.end(), rand); //   
thrust::device_vector<DataType> d_vec = h_vec; //         
thrust::sort(d_vec.begin(), d_vec.end()); //    
thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin()); //   ,     

(n'oubliez pas que l'exemple doit ĂȘtre compilĂ© par un compilateur de NVIDIA)

Comme vous pouvez le voir, thrust :: sort est trĂšs similaire Ă  un algorithme similaire de STL. Cette bibliothĂšque cache de nombreuses difficultĂ©s, en particulier le dĂ©veloppement d'un sous-programme (plus prĂ©cisĂ©ment, le noyau), qui sera exĂ©cutĂ© sur la carte vidĂ©o, mais en mĂȘme temps prive de flexibilitĂ©. Par exemple, si nous voulons trier plusieurs gigaoctets de donnĂ©es, il serait logique d'envoyer une donnĂ©e Ă  la carte pour commencer le tri, et pendant le tri, envoyez plus de donnĂ©es Ă  la carte. Cette approche est appelĂ©e masquage de latence et permet une utilisation plus efficace des ressources de mappage de serveur, mais, malheureusement, lorsque nous utilisons des bibliothĂšques de haut niveau, ces opportunitĂ©s restent cachĂ©es. Mais pour le prototypage et la mesure des performances, ce sont les mĂȘmes, en particulier avec la poussĂ©e, vous pouvez mesurer les frais gĂ©nĂ©raux fournis par le transfert de donnĂ©es.

J'ai écrit une petite référence en utilisant cette bibliothÚque, qui exécute plusieurs algorithmes populaires avec différentes quantités de données sur le GPU, voyons quels sont les résultats.

RĂ©sultats de l'algorithme GPU


Pour tester le GPU, j'ai pris une instance dans AWS avec une carte vidéo Tesla k80, ce n'est pas la carte serveur la plus puissante à ce jour (la Tesla v100 la plus puissante), mais la plus abordable et embarquée:

  • 4992 CUDA Kernels
  • 24 Go de mĂ©moire
  • 480 Gb / s - bande passante mĂ©moire 

Et pour les tests sur le CPU, j'ai pris une instance avec un processeur Intel Xeon CPU E5-2686 v4 @ 2.30GHz

Transformation



Temps d'exécution de la transformation sur le GPU et le CPU en ms

Comme vous pouvez le voir, la transformation habituelle des Ă©lĂ©ments du tableau est approximativement la mĂȘme dans le temps, Ă  la fois sur le GPU et sur le CPU. Et pourquoi? Parce que le surcoĂ»t pour l'envoi de donnĂ©es vers la carte et le dos absorbe toute l'augmentation des performances (nous parlerons du surcoĂ»t sĂ©parĂ©ment), et il y a relativement peu de calculs sur la carte. De plus, n'oubliez pas que les processeurs prennent Ă©galement en charge les instructions SIMD et que les compilateurs dans des cas simples peuvent les utiliser efficacement. 

Voyons maintenant l'efficacité de l'agrégation sur le GPU.

Agrégation



Temps d'exécution d'agrégation sur GPU et CPU en ms

Dans l'exemple d'agrĂ©gation, nous constatons dĂ©jĂ  une augmentation significative des performances avec une augmentation du volume de donnĂ©es. Il convient Ă©galement de prĂȘter attention au fait que nous pompons une grande quantitĂ© de donnĂ©es dans la mĂ©moire de la carte, et qu'une seule valeur agrĂ©gĂ©e est reprise, c'est-Ă -dire Les frais gĂ©nĂ©raux pour le transfert de donnĂ©es de la carte vers la RAM sont minimes.

Passons à l'exemple le plus intéressant - le tri.

Tri



Temps de tri vers le GPU et le CPU en ms

Malgré le fait que nous envoyons l'intégralité du tableau de données à la carte vidéo et vice versa, le tri vers le GPU 800 Mo de données est environ 25 fois plus rapide que sur le processeur.

Frais généraux de transfert de données


Comme le montre l'exemple de transformation, il n'est pas toujours Ă©vident que le GPU sera efficace mĂȘme dans les tĂąches qui sont bien parallĂšles. La raison en est un surcoĂ»t pour le transfert de donnĂ©es de la RAM de l'ordinateur vers la mĂ©moire de la carte vidĂ©o (dans les consoles de jeu, en passant, la mĂ©moire est partagĂ©e entre le CPU et le GPU, et il n'est pas nĂ©cessaire de transfĂ©rer des donnĂ©es). Une des caractĂ©ristiques d'une carte vidĂ©o est la bande passante mĂ©moire ou bande passante mĂ©moire, qui dĂ©termine la bande passante thĂ©orique de la carte. Pour Tesla k80, elle est de 480 Go / s, pour Tesla v100, elle est dĂ©jĂ  de 900 Go / s. De plus, la version PCI Express et l'implĂ©mentation de la façon dont vous transfĂ©rerez les donnĂ©es sur la carte affecteront le dĂ©bit, par exemple, cela peut ĂȘtre fait dans plusieurs flux parallĂšles.

Examinons les résultats pratiques obtenus pour la carte graphique Tesla k80 dans le cloud Amazon:


Temps de transfert des données vers le GPU, tri et transfert des données vers la RAM en ms

HtoD - transfert des données vers la carte vidéo

GPU Exécution - tri sur la carte vidéo

DtoH - copie des données de la carte vidéo vers la RAM


La premiÚre chose à noter est que la lecture des données de la carte vidéo est plus rapide que écrivez-les là-bas.

La seconde - lorsque vous travaillez avec une carte vidĂ©o, vous pouvez obtenir une latence de 350 microsecondes, et cela peut dĂ©jĂ  ĂȘtre suffisant pour certaines applications Ă  faible latence.

Le graphique ci-dessous montre une surcharge pour plus de données:


Temps de transfert des données vers le GPU, tri et transfert des données vers la RAM en ms

Utilisation du serveur


La question la plus courante est de savoir en quoi une carte vidéo de jeu diffÚre d'une carte serveur? Selon les caractéristiques, ils sont trÚs similaires, mais les prix diffÚrent considérablement.


Les principales différences entre le serveur (NVIDIA) et la carte de jeu:

  • Garantie du fabricant (la carte de jeu n'est pas conçue pour une utilisation sur serveur)
  • ProblĂšmes de virtualisation possibles pour une carte graphique grand public
  • DisponibilitĂ© du mĂ©canisme de correction d'erreur sur la carte serveur
  • Le nombre de threads parallĂšles (pas les cƓurs CUDA) ou la prise en charge d'Hyper-Q, qui vous permet de travailler avec la carte Ă  partir de plusieurs threads sur le CPU, par exemple, tĂ©lĂ©charger des donnĂ©es sur la carte Ă  partir d'un thread et dĂ©marrer les calculs Ă  partir d'un autre

Ce sont peut-ĂȘtre les principales diffĂ©rences importantes que j'ai trouvĂ©es.

Multithreading


AprĂšs avoir compris comment exĂ©cuter l'algorithme le plus simple sur la carte vidĂ©o et quels rĂ©sultats peuvent ĂȘtre attendus, la prochaine question logique est de savoir comment la carte vidĂ©o se comportera lors du traitement de plusieurs demandes parallĂšles. En rĂ©ponse, j'ai deux graphiques de calcul sur le GPU et un processeur Ă  4 et 32 ​​cƓurs:


Temps nécessaire pour effectuer des calculs mathématiques sur le GPU et le CPU avec des matrices de 1000 x 60 en ms

. Ce graphique effectue des calculs avec des matrices de 1000 x 60 Ă©lĂ©ments. Les calculs sont lancĂ©s Ă  partir de plusieurs flux de programme, un flux sĂ©parĂ© est crĂ©Ă© pour le GPU pour chaque flux CPU (le trĂšs Hyper-Q est utilisĂ©). 

Comme vous pouvez le voir, le processeur gÚre trÚs bien cette charge, tandis que la latence pour une demande par GPU augmente considérablement avec une augmentation du nombre de demandes parallÚles.


Le temps pour effectuer des calculs mathématiques sur le GPU et le CPU avec des matrices 10 000 x 60 en ms.

Sur le deuxiĂšme graphique, les mĂȘmes calculs, mais avec des matrices 10 fois plus longues, et le GPU se comporte beaucoup mieux sous une telle charge. Ces graphiques sont trĂšs indicatifs, et nous pouvons conclure: le comportement sous charge dĂ©pend de la nature de la charge elle-mĂȘme. Un processeur peut Ă©galement gĂ©rer les calculs matriciels assez efficacement, mais dans une certaine mesure. Pour une carte vidĂ©o, il est caractĂ©ristique que pour une petite charge de calcul, les performances chutent de façon approximativement linĂ©aire. Avec une augmentation de la charge et du nombre de threads parallĂšles, la carte vidĂ©o s'adapte mieux. 

Il est difficile de supposer comment le GPU se comportera dans diverses situations, mais comme vous pouvez le voir, dans certaines conditions, une carte serveur peut traiter les demandes de plusieurs flux parallĂšles assez efficacement.

Nous discuterons de quelques autres questions que vous pourriez avoir si vous décidez toujours d'utiliser le GPU dans vos projets.

Limite de ressources


Comme nous l'avons dĂ©jĂ  dit, les deux principales ressources d'une carte vidĂ©o sont le calcul des cƓurs et de la mĂ©moire.

Par exemple, nous avons plusieurs processus ou conteneurs utilisant une carte vidĂ©o, et nous aimerions pouvoir partager la carte vidĂ©o entre eux. Malheureusement, il n'y a pas d'API simple pour cela. NVIDIA propose la technologie vGPU , mais je n'ai pas trouvĂ© la carte Tesla k80 dans la liste des cartes prises en charge, et d'aprĂšs ce que je peux comprendre de la description, la technologie est plus axĂ©e sur les Ă©crans virtuels que sur les calculs. AMD propose peut-ĂȘtre quelque chose de plus appropriĂ©.

Par consĂ©quent, si vous prĂ©voyez d'utiliser le GPU dans vos projets, vous devez vous fier au fait que l'application utilisera exclusivement la carte vidĂ©o, ou vous contrĂŽlerez par programme la quantitĂ© de mĂ©moire allouĂ©e et le nombre de cƓurs utilisĂ©s pour les calculs.

Conteneurs et GPU


Si vous avez déterminé la limite de ressources, alors la question logique suivante: que faire s'il y a plusieurs cartes vidéo sur le serveur?

Encore une fois, vous pouvez décider au niveau de l'application quel GPU il utilisera.

Les conteneurs Docker sont un autre moyen plus pratique. Vous pouvez utiliser des conteneurs réguliers, mais NVIDIA propose ses conteneurs NGC , avec des versions optimisées de divers logiciels, bibliothÚques et pilotes. Pour un conteneur, vous pouvez limiter le nombre de GPU utilisés et leur visibilité sur le conteneur. Les frais généraux liés à l'utilisation des conteneurs sont d'environ 3%.

Travailler en cluster


Une autre question, que faire si vous souhaitez effectuer une tĂąche sur plusieurs GPU au sein du mĂȘme serveur ou cluster?

Si vous avez choisi une bibliothĂšque similaire Ă  Thrust ou une solution de niveau infĂ©rieur, la tĂąche devra ĂȘtre rĂ©solue manuellement. Les cadres de haut niveau, tels que pour l'apprentissage automatique ou les rĂ©seaux de neurones, prennent gĂ©nĂ©ralement en charge la possibilitĂ© d'utiliser plusieurs cartes prĂȘtes Ă  l'emploi.

De plus, je voudrais noter que, par exemple, NVIDIA propose une interface pour l'échange direct de données entre les cartes - NVLINK , qui est nettement plus rapide que PCI Express. Et il existe une technologie pour l'accÚs direct à la mémoire de la carte à partir d'autres périphériques PCI Express - GPUDirect RDMA , incl. et réseau .

Recommandations


Si vous envisagez d'utiliser le GPU dans vos projets, le GPU vous convient probablement si:

  • Votre tĂąche peut ĂȘtre rĂ©duite Ă  une vue SIMD
  • Il est possible de charger la plupart des donnĂ©es sur la carte avant les calculs (cache)
  • Le dĂ©fi passe par l'informatique intensive

Vous devez Ă©galement poser des questions Ă  l'avance:

  • Combien de requĂȘtes parallĂšles seront 
  • Quelle latence attendez-vous
  • Avez-vous besoin d'une carte pour votre charge? Avez-vous besoin d'un serveur avec plusieurs cartes ou d'un cluster de serveurs GPU 

C'est tout, j'espÚre que le matériel vous sera utile et vous aidera à prendre la bonne décision!

Références


Benchmark et résultats sur github - https://github.com/tishden/gpu_benchmark/tree/master/cuda

En plus du sujet, un enregistrement du rapport «GPU Databases - Architecture, Performance and Prospects for Use»

NVIDIA NGC Containers Webinar Webinaires - http : //bit.ly/2UmVIVt ou http://bit.ly/2x4vJKF

All Articles