image

Une des nouveautés majeures de C++ AMP dans Visual Studio 2013 est le support de la mémoire partagée. Si vous suivez ce blog ou que vous pratiquez déjà la programmation GPU avec CUDA par exemple; vous connaissez le terme shared memory dans le cadre où votre algorithme consomme plusieurs fois les mêmes données: vous pouvez appliquer le principe de chargement des données par tuile : pour chaque tuile, vous chargez une fois les données depuis la mémoire globale pour les enregistrer dans de la mémoire rapide proche des processeurs GPU (appelé shared memory en CUDA). Mais la nouveauté de C++ AMP ne concerne pas ce sujet (qui est déjà supporté depuis la version 1.0).

Depuis quelque temps, les processeurs modernes comme la 3ième génération Intel Core Processor (Ivy Bridge et le dernier Haswell) et chez AMD les APUs (Llano and Trinity), possèdent au sein même du processeur une carte graphique intégrée qui partage du coup, la même mémoire physique que le CPU. Dans ce cadre, copier les données CPU vers la partie GPU et vice versa est complètement inutile et sous performants. Ce principe reste valable pour l’accélérateur de repli, WARP, si aucune carte GPU n’est reconnue par le pilote DirectX.

Le conteneur concurrency ::array_view est l’une des abstractions qui permet au développeur de manipuler les données afin réaliser des copies entre la mémoire CPU et GPU sans difficulté. Tout le travail de copie des données vers ou depuis l’accélérateur est réalisé au niveau de l’implémentation.

Avec Visual Studio 2013 et sous Windows 8.1, les accélérateurs peuvent supporter cette notion de partage de donnée entre CPU et GPU dans le cadre d’un périphérique moderne.

Cette nouvelle fonctionnalité peut apporter des excellentes performances dans le cadre de carte GPU intégrée. Du côté des fondeurs, cette fonctionnalité semble être un choix d’avenir pour les PC, les tablettes et les smart-phones.

Je reviendrai plus en détail sur cette nouvelle fonctionnalité dans un prochain billet.

A bientôt

Bruno