Pourquoi utiliser SIMD si nous avons GPGPU?

13

Je pensais que cette question était mieux servie dans la partie CS de Stack Exchange. Maintenant que nous avons des GPGPU avec des langages comme CUDA et OpenCL, les extensions multimédia SIMD (SSE / AVX / NEON) ont-elles toujours une utilité?

J'ai lu récemment un article sur la façon dont les instructions SSE pouvaient être utilisées pour accélérer les réseaux de tri. Je pensais que c'était assez bien, mais quand j'ai dit à mon professeur d'architecture comp, il a ri et a dit que l'exécution d'un code similaire sur un GPU détruirait la version SIMD. Je n'en doute pas, car SSE est très simple et les GPU sont de grands accélérateurs très complexes avec beaucoup plus de parallélisme, mais cela m'a fait penser, y a-t-il de nombreux scénarios où les extensions multimédia SIMD sont plus utiles que l'utilisation d'un GPU?

Si les GPGPU rendent les SIMD redondants, pourquoi Intel augmenterait-il leur prise en charge SIMD? SSE était de 128 bits, il est maintenant de 256 bits avec AVX et l'année prochaine, il sera de 512 bits. Si les GPGPU sont un meilleur code de traitement avec parallélisme des données, pourquoi Intel pousse-t-il ces extensions SIMD? Ils pourraient être en mesure de mettre les ressources équivalentes (recherche et zone) dans un cache plus grand et un prédicteur de branche améliorant ainsi les performances série.

Pourquoi utiliser SIMD au lieu des GPGPU?

jonfrazen
la source
2
C'est un défi en soi de nourrir le GPU avec suffisamment de données pour l'occuper. Le transfert de données entre l'hôte et l'appareil est pratiquement toujours le goulot d'étranglement. Certaines opérations sont mieux prises en charge sur les CPU (par exemple, la multiplication sans report; voir PCLMULQDQ).
Juho
2
@Juho Les nouveaux appareils comme les APU d'AMD n'ont-ils pas le GPU et le CPU sur le même dé? Cela élimine-t-il le goulot d'étranglement?
jonfrazen
1
En fin de compte, une instruction vectorielle est toujours une instruction unique, et le coût de sa planification et de son exécution est le même que toute autre instruction unique. Il est logique d'exécuter des travaux sur le GPU lorsque les avantages l'emportent sur les coûts. Considérez également que vous obtenez une unité SIMD par cœur, mais généralement un seul GPU par châssis, et le GPU est actuellement une ressource partagée. Cela limite le nombre de travaux que vous pouvez exécuter sur un GPU. (Le nombre de cœurs augmente tout le temps, mais pas le nombre de GPU.)
Pseudonyme du
Intel ne fait pas grand-chose en termes de GPU (à part Larrabee / Knights Landing :)), donc je suppose qu'il est naturel pour eux d'essayer de pousser AVX à la place. Bien que l'utilisation intensive d'AVX puisse être très performante, cela entraîne maintenant un downclocking sur leurs nouveaux processeurs, donc ils peuvent atteindre les limites avec quelque chose.
nsandersen

Réponses:

16

Rien n'est gratuit. Les GPGPU sont SIMD. Les instructions SIMD sur les GPGPU ont tendance à être plus larges que les instructions SIMD sur les CPU. Les GPGPU ont tendance à être multithread à grain fin (et ont beaucoup plus de contextes matériels que les CPU). Les GPGPU sont optimisés pour le streaming . Ils ont tendance à consacrer un plus grand pourcentage de surface aux unités à virgule flottante, un pourcentage plus faible de surface à mettre en cache et un pourcentage plus faible de surface aux performances entières.

Faisons une comparaison. Le Core i7-5960x d'Intel dispose de 8 cœurs, chacun avec SIMD 4 larges (double précision), fonctionnant à 3 GHz (3,5 GHz turbo), un cache L3 de 20 Mo, consomme 356 mm ^ 2 et 140 W et coûte 1000 $ . Donc 8 * 4 * 3 * 4 = 384 GFlops double précision. (Le 4x supplémentaire est dû au fait que vous pouvez effectuer deux ajouts-multiplications fusionnés par voie vectorielle par cycle.) Il peut effectuer 768 GFlops simple précision. Cela représente environ 1,08 DP GFlops / mm ^ 2 et 2,75 DP GFlops / Watt. Il y a également environ 57,5 ​​Ko / mm ^ 2 de cache sur puce.

La GeForce GTX Titan Black de NVidia possède 15 SMX, chacun avec une carte SIMD double précision de 32 larges, fonctionnant à 890 MHz (980 MHz turbo), 3,5 M de cache L1 + L2, consomme 561 mm ^ 2, 250 W et coûte 1000 $ . Donc 15 * 32 * .89 * 4 = 1709 GFlops double précision. (Même 4x à partir de deux ajouts-multiplications fusionnés par voie vectorielle par cycle.) Il peut effectuer 5126 GFlops simple précision. Cela représente environ 3,05 DP GFlops / mm ^ 2 et 6,8 DP GFlops / Watt. Donc 3x la densité de virgule flottante DP par unité de surface et 3x l'efficacité énergétique DP en virgule flottante. Et le compromis? 6,4 Ko / mm ^ 2 de cache sur puce. Environ 9 fois moins dense que le CPU.

La principale différence est donc que le GPU a choisi un équilibre de zone qui favorise fortement la virgule flottante (et en particulier la virgule flottante simple précision) par rapport au cache. Même en ignorant le fait que vous devez copier des choses entre le CPU et le GPU pour faire des E / S, la façon dont le GPU va faire par rapport au CPU dépend du programme que vous exécutez.

Si vous avez un programme de virgule flottante parallèle de données avec très peu de divergence de contrôle (toutes les voies vectorielles font la même chose en même temps) et que votre programme est en streaming (ne peut pas bénéficier de la mise en cache), alors le GPU va être sur le point 3 fois plus efficace par unité de surface ou par Watt. Mais si vous avez une quantité importante de contrôle divergent, un travail non parallèle aux données à faire, ou si vous pourriez bénéficier de grandes structures de données à lecture multiple, le processeur fera probablement mieux.

Logique errante
la source