AMD Radeon HD 4870 & 4850

Publié le 25/06/2008 par
Imprimer
SIMT vs SIMD vs MIMD
Avec les GeForce 8, Nvidia a introduit une architecture en rupture totale avec le passé. Ainsi, fini les énormes unités vectorielles MIMD dont il est parfois difficile de tirer le maximum. Le choix a été fait pour des unités scalaires. Si au niveau de l'implémentation il s'agit d'unités SIMD (comme le SSE) larges de 256 bits (8 x 32 bits), sur le plan fonctionnel, ce n'est pas une instruction de 8 opérations 32 bits qui est appliquées sur 1 thread/élément à chaque cycle, mais bien 1 opération 32 bits sur 8 threads/éléments. Du coup en pratique, pour l'extérieur, ces unités se comportent comme des unités scalaires.

Pour marquer cette différence avec le SIMD (Single Instruction Multiple Data), Nvidia parle de SIMT (Single Instruction Multiple Threads). Si les unités sont similaires, le SIMT permet de maximiser l'utilisation des unités naturellement si la tâche à accomplir est massivement parallèle, comme c'est le cas pour le rendu 3D. L'intérêt étant qu'en SIMT, le programmeur n'a rien à faire pour que ce soit le cas, alors qu'en SIMD, le programmeur et le compilateur doivent s'efforcer de remplir l'unité vectorielle, ce qui n'est pas toujours simple puisqu'il faut qu'une instruction identique soit exécutée plusieurs fois sur des données différentes d'un même thread et qu'elles ne soient pas dépendantes l'une de l'autre pour qu'elles puissent être traitées en parallèle.

Le MIMD (Multiple Instructions Multiple Data), tel qu'exploité par AMD dans les Radeon HD 2000/3000 est plus flexible puisque la première contrainte disparaît. La seconde reste cependant très importante.

Le SIMT n'est bien entendu pas la solution ultime, puisqu'il s'agit toujours de compromis. Plus efficace il est aussi plus gourmand en termes de transistors, de surface sur la puce et de consommation puisqu'il a besoin d'une logique de gestion plus complexe. Le SIMD et le MIMD permettent par contre de placer plus d'unités de calcul dans le GPU, au prix d'une efficacité moindre. Pour les Radeon il s'agit en réalité d'un mix entre le SIMT et le MIMD.

Les GeForce 8 sont ainsi nées avec seulement 128 unités scalaires alors qu'une Radeon HD 3870 contient 64 unités vec5, soit l'équivalent de 320 unités scalaires. L'efficacité supérieure du SIMT n'est bien entendu pas suffisante par rapport à cette différence. Par contre, Nvidia est parvenu à implémenter des unités de calcul de type double pumped, c'est-à-dire fonctionnant à une vitesse double par rapport au scheduler.


Architecture Radeon HD 2000 et 3000
Le coeur des Radeon HD 2900 et 3800 repose sur 4 gros blocs d'unités de calcul que nous appellerons multiprocesseurs pour faire le parallèle avec l'architecture GeForce 8/9/GTX. Chaque multiprocesseur dispose de son propre scheduler, d'un gros fichier de registres généraux et de 16 processeurs vec5, ou vec4+1 pour être précis. L'équivalent de 80 processeurs scalaires.

Première différence entre les architectures : une logique de gestion (scheduler etc.) pour 80 unités de calcul chez AMD contre une logique de gestion pour 8 unités de calcul (+ SFU) chez Nvidia. AMD a donc un coût nettement moindre en terme de gestion par unité de calcul. En contrepartie, AMD doit d'une part travailler sur des groupes d'éléments plus gros (64 contre 16 ou 32 chez Nvidia) et d'autre part fait appel à des processeurs vec4+1 et non à des processeurs scalaires.

C'est dans ce sens qu'il s'agit d'un mix entre le SIMT et le MIMD. Un multiprocesseur est SIMT 16-way puisqu'il exécute les mêmes instructions sur 16 threads en parallèle mais il est également MIMD 5-way puisque il peut exécuter jusqu'à 5 instructions en même temps sur des données différentes de ces threads.

Nous précisons vec4+1 puisqu'un processeur de Radeon est en réalité composé d'une unité MIMD basée autour d'une unité FMAD vec4 et d'une grosse unité scalaire qui peut prendre en charge toutes les instructions (à l'exception du produit scalaire). Autrement dit, les instructions spéciales et les instructions sur les entiers doivent toutes passer par cette unité.

Parallèlement à ces 4 gros multiprocesseurs, les Radeon possèdent 4 blocs d'unités de texturing complètement découplés. Ceux-ci sont capables de sampler et de filtrer 4 texels 4D en FP16 (HDR) via leurs 4 unités de texturing principales et d'accéder à 4 texels 1D supplémentaires, mais sans les filtrer. Etant découplées, ces unités de texturing ne sont pas liées à un multiprocesseur particulier et peuvent donc toujours être utilisables, même si un multiprocesseur n'a pas besoin d'elles.

Reste que par rapport aux 64 unités de filtrage d'une GeForce 9800 GTX, les 16 unités de filtrage d'une Radeon HD 3870 font un peu léger et les 16 samplers 1D supplémentaires n'y changent rien.
Vos réactions

Top articles