Procédé et dispositif de codage ou décodage d'image avec parallélisation du traitement sur plusieurs processeurs et coprocesseurs, programme d'ordinateur et moyen de stockage correspondants. 1. DOMAINE DE L'INVENTION Le domaine de l'invention est celui du codage/décodage d'images numériques. Elle s'applique notamment, mais non exclusivement, dans le domaine des encodeur/décodeurs (codecs) vidéo dits temps réel. Typiquement, une image numérique comprend des blocs rectangulaires de pixels (aussi appelés macro-blocs), ces blocs étant répartis en lignes et en colonnes. Chaque bloc rectangulaire possède une largeur de w pixels et une hauteur de h pixels. Dans le standard H.264/AVC (ITU-T H.264, ISO/IEC 14496-10), par exemple, les images sont découpées soit en blocs de 16x16 pixels, soit en blocs de 16x32 (mode MBAFF). Traditionnellement, le codage ou décodage d'une image consiste à traiter l'ensemble de ses blocs, séquentiellement ligne par ligne, de gauche à droite sur une même ligne, et de haut en bas d'une ligne à l'autre. L'invention s'applique notamment, mais non exclusivement, au codage ou décodage d'une séquence vidéo formée d'images successives. Dans ce cas, la technique de codage ou décodage est mise en oeuvre dans un algorithme de compression ou décompression vidéo. Elle est alors conforme à une norme de compression/décompression telle que (cette liste n'est pas exhaustive) : - la norme H.263, définie dans le document de normalisation ITU-T H.263 ; - la norme H.263+, définie dans le document de normalisation ITU-T H.263+ ; - la norme H.264 (aussi appelé H.26L ou MPEG-4 AVC) : définie dans le document de normalisation ISO MPEG-4 Part 10 ; - la norme MPEG-4 Video : définie dans le document de normalisation ISO MPEG-4 Part 2 . Il est clair cependant que l'invention s'applique également au codage ou décodage d'une image fixe.
D'une façon générale, la présente invention peut s'appliquer dans tous les cas où il existe un contexte de dépendance spatiale pour le traitement des blocs d'une image. En d'autres termes, on suppose que pour traiter chaque bloc de l'image, on doit connaître le résultat du traitement préalable d'autres blocs de la même image.
Un tel contexte de dépendance spatiale existe notamment, mais non exclusivement, dans les procédés de codage ou décodage conformes aux normes de compression/décompression précités et basés sur une estimation de mouvement. A titre d'exemple, la figure 1 décrit les dépendances spatiales qui existent entre les blocs d'une image dans le cadre du standard H.264/AVC. Pour traiter un bloc B donné, le résultat du traitement des blocs du voisinage spatial causal BA (bloc de gauche), BB (bloc du dessus), Bc (bloc du dessus à droite) et BD (bloc du dessus à gauche) doit être connu. 2. ARRIÈRE-PLAN TECHNOLOGIQUE On décrit ci-dessous la problématique existant dans le cas d'un codage/décodage d'une séquence vidéo formée d'images successives, à laquelle ont été confrontés les inventeurs de la présente demande de brevet. L'invention ne se limite bien sûr pas à ce cas particulier d'application, mais présente un intérêt pour toute technique de codage/décodage d'image devant faire face à une problématique proche ou similaire. Concevoir un encodeur vidéo à la fois temps réel et de haute qualité est un véritable défi technologique, en particulier dans le cas de vidéos hautes résolutions (par exemple SD ( Standard Definition ), HD ( High Definition . En effet, l'encodage vidéo est une application particulièrement complexe. Il apparaît que le traitement de l'ensemble des blocs d'une image par un unique processeur n'est pas optimale en temps de calcul. Afin de réunir la puissance de calcul nécessaire, il est donc souvent fait appel à la parallélisation : plusieurs unités de traitement fonctionnent simultanément sur différentes portions de la vidéo. Le temps de calcul peut théoriquement être divisé par le nombre d'unités de traitement mises en oeuvre. Une première technique connue de parallélisation d'un encodeur vidéo consiste à limiter les dépendances spatiales ou temporelles. Ainsi, le standard H.264/AVC (ITU-T H.264, ISO/IEC 14496-10) permet le découpage des images en tranches indépendantes (appelées suces en anglais). Les tranches d'une même image peuvent être encodées en parallèle, chaque tranche étant traitée par une unité de traitement (processeur) distincte. Il suffit ensuite de concaténer les trains binaires résultant du traitement des différentes tranches.
Cette première technique connue a pour inconvénient majeur de limiter les performances de l'encodeur en termes de compression/qualité (perte d'efficacité en compression). En effet, outre l'alourdissement des éléments de syntaxe relatifs aux tranches, la découpe en tranches interdit l'utilisation de la corrélation spatiale inter-tranche. Or les dépendances spatiales et temporelles ont pour fonction d'exploiter au mieux les corrélations présentes dans la source vidéo. C'est ce qui permet de maximiser l'efficacité de compression de l'encodeur vidéo. En effet, les formats de compression vidéo récents (H.264/AVC, MPEG4 ASP, H.263) introduisent de fortes dépendances spatiales et temporelles dans le traitement des vidéos. Les images sont généralement découpées en blocs de taille 16x16 pixels (macroblocs). Le traitement successif de ces blocs est séquentiel par nature, dans la mesure où le traitement de chaque bloc nécessite la connaissance du résultat du traitement des blocs voisins. De même, temporellement, les images peuvent classiquement être encodées selon 3 modes différents, I, P ou B. L'encodage d'une image B nécessite la connaissance d'au moins deux images P précédemment encodées. L'encodage d'une image P nécessite la connaissance d'au moins une image P précédemment encodée. Une deuxième technique connue de parallélisation d'un encodeur vidéo est décrite dans la demande de brevet publiée sous le numéro WO 2004/100557, et déposée par Envivio. Il s'agit d'une méthode de parallélisation spatiale du traitement des blocs sur N processeurs, permettant de conserver les dépendances imposées par les standards de compression vidéo. Le principe général consiste à découper l'image en bandes perpendiculaires à la direction de traitement séquentiel des blocs. Ceci permet d'obtenir une répartition optimale des charges entre processeurs. Par exemple, si le traitement des macro-blocs est effectué séquentiellement ligne par ligne, on sépare l'image en bandes verticales. Par ailleurs, la synchronisation des traitements effectués par les N processeurs permet d'éviter qu'un processeur tente de traiter un bloc donné alors que d'autres blocs dont dépend ce bloc donné n'ont pas encore été traités.
Cette deuxième technique connue est efficace, mais peut se révéler insuffisante pour plusieurs raisons : ^ le nombre N de processeurs est limité. En effet, on ne peut pas utiliser plus de W processeurs, avec W le nombre de blocs par ligne de l'image (c'est-à-dire la largeur de l'image en blocs) dans le cas d'un traitement ligne par ligne, avec découpage de l'image en bandes verticales. De plus, plus le nombre de processeurs utilisés est important, moins le parallélisme est efficace, du fait des phases d'initialisation et de terminaison durant lesquelles les processeurs ne sont pas tous utilisés ; ^ concevoir une machine avec beaucoup de processeurs est compliqué et coûteux ; ^ même avec des plateformes multiprocesseurs comprenant beaucoup de processeurs, la puissance de calcul totale est limitée et peut se révéler insuffisante. Il est nécessaire de disposer de davantage de puissance afin d'améliorer les performances en compression des encodeurs vidéo temps réel.
Il est classique de recourir à des coprocesseurs afin d'augmenter la capacité de traitement des processeurs. En général, chaque processeur se voit adjoindre un coprocesseur. De manière générale, on différencie processeur et coprocesseur non pas par leur nature technique (CPU, FPGA, ASIC, DSP, ...) mais par leur rôle dans le système. Le processeur a un rôle d'unité de traitement maître, il est chargé du contrôle global de l'application, ainsi que d'un certain nombre de tâches de décision et de calcul. Le coprocesseur a un rôle d'unité de traitement esclave, il est utilisé par le processeur pour les calculs les plus complexes. A noter que dans un tel schéma processeur/coprocesseur, la communication de données entre processeur et coprocesseur peut prendre un temps non négligeable, ce qui nuit à la performance globale du dispositif. Souvent en pratique, les processeurs dits génériques permettent de faire toutes sortes de calculs, ont des accès mémoires rapides et sont efficaces en cas de branchements (instructions si ( if en anglais), boucles). En revanche, ce ne sont pas forcément les plus puissants. Les coprocesseurs, par exemple les DSP ou les FPGA, sont mieux adaptés au calcul intensif. Cependant, ils sont davantage pénalisés par les branchements et n'ont pas les mêmes capacités mémoire.
Cependant, dans le contexte de la deuxième technique connue précitée, de parallélisation d'un encodeur vidéo, l'utilisation combinée de processeurs et de coprocesseurs n'est pas aisée ni sans poser de problème. En effet, la solution basique consistant à adjoindre un coprocesseur à chaque processeur (et donc utiliser un nombre N de processeurs égal au nombre M de coprocesseurs) n'est pas optimale. En effet, pour qu'une telle solution soit efficace, il faudrait s'assurer que les coprocesseurs soient correctement dimensionnés par rapport aux traitements demandés, ce qui est malheureusement difficile, voire impossible, en pratique. Si les coprocesseurs ont une puissance insuffisante, le système ne pourra évidemment pas fonctionner. Si au contraire les coprocesseurs sont trop puissants, ils seront sous-exploités et le surcoût lié à la mise en oeuvre de ces coprocesseurs plus puissant sera inutile. Il conviendrait donc d'adopter une solution plus complexe, dans laquelle le nombre N de processeurs serait différent du nombre M de coprocesseurs (c'est-à-dire : N ~ M, avec N > 0 et M > 0). Par exemple, en cherchant à développer des produits à base de processeurs génériques et de coprocesseurs de type FPGA, les inventeurs de la présente demande se sont trouvés confrontés à un décalage important entre les capacités de traitement des processeurs et des coprocesseurs. De plus, mettre en oeuvre un coprocesseur par processeur est complexe et coûteux. Dans ce cadre, il serait plus intéressant d'utiliser un seul coprocesseur très puissant pour plusieurs processeurs. Par exemple, un seul coprocesseur FPGA pour quatre processeurs. Cependant, rien dans l'état de l'art n'indique comment gérer la parallélisation et la synchronisation des traitements dans un tel contexte. 3. OBJECTIFS DE L'INVENTION L'invention, dans au moins un mode de réalisation, a notamment pour objectif de pallier ces différents inconvénients de l'état de la technique. Plus précisément, dans au moins un mode de réalisation de l'invention, un objectif est de fournir une technique permettant, afin d'augmenter la puissance de calcul totale, de paralléliser et synchroniser les traitements entre un ensemble de processeurs et un ou plusieurs ensembles de coprocesseurs de cardinalités différentes, tout en respectant des dépendances spatiales qui existent entre les blocs d'une image (contraintes de causalité, telles que présentées par exemple sur la figure 1).
Au moins un mode de réalisation de l'invention a également pour objectif de fournir une telle technique qui soit simple à mettre en oeuvre et peu coûteuse.
Un autre objectif d'au moins un mode de réalisation de l'invention est de fournir une telle technique adaptée à toutes les situations où le nombre N de processeurs est différent du nombre M de coprocesseurs (N ~ M, avec N > 0 et M > 0).
Un objectif complémentaire d'au moins un mode de réalisation de l'invention est de fournir une telle technique permettant d'optimiser les temps de calcul et les messages de synchronisation échangés entre les processeurs et les coprocesseurs.
4. EXPOSÉ DE L'INVENTION Dans la présente description, on entend par processeur tout type d'unité de traitement maître, et par coprocesseur tout type d'unité de traitement esclave.
Dans un premier mode de réalisation de l'invention, il est proposé un procédé de codage ou décodage d'une image comprenant des blocs rectangulaires de pixels, l'image ayant une hauteur de H blocs et une largeur de W blocs, l'image étant découpée en bandes de blocs verticales, ledit procédé comprenant les étapes suivantes : - obtention de N processeurs et M coprocesseurs, lesdits M coprocesseurs étant répartis sur S niveaux, avec N > 0, M > 0, N+M > 2 et S > 0 ; - affectation desdits N processeurs P; à N bandes contiguës BP1 de tailles K; blocs, N-1 avec 0 i s N-1 et Ki = W; - pour tout niveau de coprocesseurs s, avec 0 s s s S-1, affectation de Ms coprocesseurs CPs, à ms bandes contiguës BCPs, de tailles Qsd blocs, avec : M,-1 - gestion d'envoi de messages vers les processeurs et les coprocesseurs selon les règles suivantes, en notant BP,, r une ligne de rang r de la bande BP1, et BCPs, i, r une ligne de rang r de la bande BCPs,, avec 0 s r s H-1 : * lorsqu'un processeur P1, avec i 0 et i < N-1, a terminé le traitement d'une ligne BP,,r, envoi d'un premier message de départ autorisant le processeur P1+1 à traiter la ligne BP1+i, r ; 30 * lorsqu'un coprocesseur CPs, j, avec j 0 et j < Ms-1, a terminé le traitement d'une ligne BCPs, j, r, envoi d'un deuxième message de départ autorisant le coprocesseur CPs,+1 à traiter la ligne BCPs,+l,r ; * lorsqu'un processeur P;, avec i 0 et i < N-1, doit traiter le dernier bloc de la ligne BP,, r, avec r > 0, envoi d'un premier message de vérification au processeur P;+1 afin de vérifier si le premier bloc de la ligne BP;+1, r_1 a déjà été traité ; * lorsqu'un coprocesseur CPs,, avec j 0 et j < Ms-1, doit traiter le dernier bloc de la ligne BCPs, j,,, avec r > 0, envoi d'un deuxième message de vérification au coprocesseur CPs,;+1 afin de vérifier si le premier bloc de la ligne BCPs,,+i, r_ 1 a déjà été traité ; * lorsque le premier bloc de la ligne BCPs, j, r appartient à la ligne BP,, r et le dernier bloc de la ligne BCPs, j, r appartient à la ligne BPi+k, r : - si k est supérieur à 0, ou - si k est égal à 0 et le dernier bloc de la ligne BCPs ,, r est le dernier bloc de la ligne BP,, r, - alors lorsque le coprocesseur CPs, j a terminé le traitement de la ligne BCPs, j, r, envoi d'un troisième message de départ autorisant le processeur pi à traiter la ligne BP,, r. 20 Dans ce premier mode de réalisation, le traitement des blocs est effectué séquentiellement ligne par ligne (cas classique d'une direction de traitement séquentiel qui est horizontale, selon une ligne). L'image est découpée en bandes verticales. Le principe général de ce premier mode de réalisation consiste donc à paralléliser un encodeur (par exemple un encodeur vidéo) sur un ensemble de 25 processeurs et de coprocesseurs simultanément, avec un nombre de processeurs différent du nombre de coprocesseurs. Les dépendances spatiales et temporelles induites par la méthode de compression sont respectées grâce à des mécanismes de synchronisation spécifiques. Les communications entre processeurs et coprocesseurs sont limitées (utilisation de seulement trois types de messages de départ et deux types de messages de 30 vérification), de manière à éviter toute perte de temps due à des latences de communication. 10 15 En d'autres termes, la technique proposée permet une exploitation optimale d'une architecture multi-(processeurs/coprocesseurs) dans le cadre de la compression d'image (par exemple compression vidéo). Elle permet notamment de paralléliser un encodeur vidéo sur plusieurs processeurs et coprocesseurs qui ont des capacités de
traitement différentes. Ainsi, on peut avoir moins de coprocesseurs que de processeurs, ou inversement. La parallélisation proposée conserve les dépendances entre blocs introduites par la méthode de compression vidéo, les performances en compression restent donc optimales.
Dans un second mode de réalisation de l'invention, il est proposé un procédé de
codage ou décodage d'une image comprenant des blocs rectangulaires de pixels, l'image ayant une hauteur de H blocs et une largeur de W blocs, l'image étant découpée en bandes de blocs horizontales, ledit procédé comprenant les étapes suivantes :
- obtention de N processeurs et M coprocesseurs, lesdits M coprocesseurs étant
répartis sur S niveaux, avec N > 0, M > 0, N+M > 2 et S > 0 ; - affectation desdits N processeurs P; à N bandes contiguës BP; de tailles K, blocs, N-1 avec0 ~i~ N-1 et =H ; =o - pour tout niveau de coprocesseurs s, avec 0 s s s S-1, affectation de Ms coprocesseurs CPs, j à ms bandes contiguës BCPs, j de tailles Qsd blocs, avec : M -1
QS,; = H ' i=o
- gestion d'envoi de messages vers les processeurs et les coprocesseurs selon les règles suivantes, en notant BP,, r une colonne de rang r de la bande BP;, et BCPs,, r une colonne de rang r de la bande BCPs,, avec 0 s r s W-1 :
* lorsqu'un processeur P;, avec i 0 et i < N-1, a terminé le traitement d'une colonne BP,,r, envoi d'un premier message de départ autorisant le processeur P;+1 à traiter la colonne BP;+1, r ;
* lorsqu'un coprocesseur CPs, j, avec j 0 et j < Ms-1, a terminé le traitement d'une colonne BCPs, j, r, envoi d'un deuxième message de départ autorisant le coprocesseur CPs,,+1 à traiter la colonne BCPs,,+i, r ;
* lorsqu'un processeur P;, avec i 0 et i < N-1, doit traiter le dernier bloc de la colonne BP,, r, avec r > 0, envoi d'un premier message de vérification au 30 processeur P;+, afin de vérifier si le premier bloc de la colonne BP;+l, r_1 a déjà été traité ; * lorsqu'un coprocesseur CPs ~, avec j 0 et j < Ms-1, doit traiter le dernier bloc de la colonne BCPs, r, avec r > 0, envoi d'un deuxième message de vérification au coprocesseur CPs, i+1 afin de vérifier si le premier bloc de la colonne BCPs,+i,r_i a déjà été traité ; * lorsque le premier bloc de la colonne BCPs, j, r appartient à la colonne BP,, r et le dernier bloc de la colonne BCPs, i, r appartient à la colonne BP;+k, r : - si k est supérieur à 0, ou - si k est égal à 0 et le dernier bloc de la colonne BCPs, j, r est le dernier bloc de la colonne BP,, r, alors lorsque le coprocesseur CPs, a terminé le traitement de la colonne BCPs, j, r, envoi d'un troisième message de départ autorisant le processeur pi à traiter la colonne BP,, r.
Dans ce second mode de réalisation, le traitement des blocs est effectué séquentiellement colonne par colonne (cas non classique aujourd'hui mais possible dans le futur d'une direction de traitement séquentiel qui est verticale, selon une colonne). L'image est découpée en bandes horizontales. Le principe général et les avantages de ce premier mode de réalisation sont les mêmes que ceux du premier mode de réalisation ci-dessus. Avantageusement, le codage ou décodage est conforme à une norme appartenant au groupe comprenant : H.263, H.263+, H264 et MPEG-4 Video. Cette liste n'est pas exhaustive. Dans un autre mode de réalisation, l'invention concerne un produit programme d'ordinateur téléchargeable depuis un réseau de communication et/ou enregistré sur un support lisible par ordinateur et/ou exécutable par un processeur. Ce produit programme d'ordinateur comprend des instructions de code de programme pour la mise en oeuvre du procédé précité (dans l'un quelconque de ses différents modes de réalisation), lorsque ledit programme est exécuté sur un ordinateur.
Dans un autre mode de réalisation, l'invention concerne un moyen de stockage lisible par ordinateur, éventuellement totalement ou partiellement amovible, stockant un programme d'ordinateur comprenant un jeu d'instructions exécutables par un ordinateur pour mettre en oeuvre le procédé précité (dans l'un quelconque de ses différents modes de réalisation).
Dans un autre mode de réalisation de l'invention, il est proposé un dispositif de codage ou décodage d'une image comprenant des blocs rectangulaires de pixels, l'image
ayant une hauteur de H blocs et une largeur de W blocs, l'image étant découpée en
bandes de blocs verticales, ledit dispositif comprenant :
- N processeurs et M coprocesseurs, lesdits M coprocesseurs étant répartis sur S
niveaux, avec N > 0, M > 0, N+M > 2 et S > 0 ; - des moyens d'affectation desdits N processeurs P; à N bandes contiguës BP1 de N-1 tailles K; blocs, avec 0 s i s N-1 et Ki = W ; - pour tout niveau de coprocesseurs s, avec 0 s s s S-1, des moyens d'affectation de Ms coprocesseurs CPs, j à ms bandes contiguës BCPs, j de tailles Qsd blocs, M,-1 avec : Qs = W ;
- des moyens de gestion d'envoi de messages vers les processeurs et les coprocesseurs selon les règles suivantes, en notant BP,, r une ligne de rang r de la bande BP1, et BCPs,j,r une ligne de rang r de la bande BCPs,, avec 0 s r s H-1 :
* lorsqu'un processeur P1, avec i 0 et i < N-1, a terminé le traitement d'une
ligne BP,,r, envoi d'un premier message de départ autorisant le processeur
P1+1 à traiter la ligne BP1+i, r ;
* lorsqu'un coprocesseur CPs, j, avec j 0 et j < Ms-1, a terminé le traitement d'une ligne BCPs, j, r, envoi d'un deuxième message de départ autorisant le coprocesseur CPs,,+1 à traiter la ligne BCPs,,+i, r ;
* lorsqu'un processeur P1, avec i 0 et i < N-1, doit traiter le dernier bloc de la ligne BP,, r, avec r > 0, envoi d'un premier message de vérification au processeur Pi+1 afin de vérifier si le premier bloc de la ligne BP1+1, r_1 a déjà été traité ;
* lorsqu'un coprocesseur CPs,, avec j 0 et j < Ms-1, doit traiter le dernier bloc de la ligne BCPs, Ir, avec r > 0, envoi d'un deuxième message de vérification au coprocesseur CPs,,+1 afin de vérifier si le premier bloc de la ligne BCPs,,+i, r_ 1 a déjà été traité ; 20 25 30 * lorsque le premier bloc de la ligne BCPs, j, r appartient à la ligne BP,, r et le dernier bloc de la ligne BCPs, j, r appartient à la ligne BP;+k, r :
- si k est supérieur à 0, ou
- si k est égal à 0 et le dernier bloc de la ligne BCPs 3, r est le dernier bloc de la ligne BP,, r,
- alors lorsque le coprocesseur CPs, j a terminé le traitement de la ligne BCPs, Ir, envoi d'un troisième message de départ autorisant le processeur pi à traiter la ligne BP,, r.
Dans un autre mode de réalisation de l'invention il est proposé un dispositif de codage ou décodage d'une image comprenant des blocs rectangulaires de pixels, l'image
ayant une hauteur de H blocs et une largeur de W blocs, l'image étant découpée en
bandes de blocs horizontales, ledit dispositif comprenant :
- N processeurs et M coprocesseurs, lesdits M coprocesseurs étant répartis sur S niveaux, avec N > 0, M > 0, N+M > 2 et S > 0 ; - des moyens d'affectation desdits N processeurs P; à N bandes contiguës BPi de N-1 tailles K; blocs, avec 0 s i s N-1 et l Ki = H; =o - pour tout niveau de coprocesseurs s, avec 0 s s s S-1, des moyens d'affectation de Ms coprocesseurs CPs, j à ms bandes contiguës BCPs, j de tailles Qsd blocs, M -1 avec : QS = H ; i=o - des moyens de gestion d'envoi de messages entre les processeurs et les coprocesseurs selon les règles suivantes, en notant BP,, r une colonne de rang r de la bande BP;, et BCPs, j, r une colonne de rang r de la bande BCPs, j, avec 0 s r s W-1 :
* lorsqu'un processeur P;, avec i 0 et i < N-1, a terminé le traitement d'une colonne BP,,r, envoi d'un premier message de départ autorisant le processeur P;+1 à traiter la colonne BP;+1, r ;
* lorsqu'un coprocesseur CPs, j, avec j 0 et j < Ms-1, a terminé le traitement d'une colonne BCPs, j, r, envoi d'un deuxième message de départ autorisant le coprocesseur CPs, j+1 à traiter la colonne BCPs,,+i, r ;
* lorsqu'un processeur P;, avec i 0 et i < N-1, doit traiter le dernier bloc de la colonne BP,, r, avec r > 0, envoi d'un premier message de vérification au 30 processeur P;+, afin de vérifier si le premier bloc de la colonne BP;+l, r_1 a déjà été traité ; * lorsqu'un coprocesseur CPs ~, avec j 0 et j < Ms-1, doit traiter le dernier bloc de la colonne BCPs, r, avec r > 0, envoi d'un deuxième message de vérification au coprocesseur CPs, i+1 afin de vérifier si le premier bloc de la colonne BCPs,+i,r_i a déjà été traité ; * lorsque le premier bloc de la colonne BCPs, j, r appartient à la colonne BP,, r et le dernier bloc de la colonne BCPs, i, r appartient à la colonne BP;+k, r : - si k est supérieur à 0, ou - si k est égal à 0 et le dernier bloc de la colonne BCPs, j, r est le dernier bloc de la colonne BP,, r, - alors lorsque le coprocesseur CPs, a terminé le traitement de la colonne BCPs, j, r, envoi d'un troisième message de départ autorisant le processeur pi à traiter la colonne BP,, r. 5. LISTE DES FIGURES D'autres caractéristiques et avantages de l'invention apparaîtront à la lecture de la description suivante, donnée à titre d'exemple indicatif et non limitatif, et des dessins annexés, dans lesquels : - la figure 1, déjà décrite en relation avec l'art antérieur, illustre un exemple de dépendance spatiale pour le traitement d'un bloc d'une image ; - la figure 2 illustre le traitement d'une image selon la technique connue décrite dans la demande de brevet WO 2004/100557 ; - la figure 3 illustre le traitement d'une image selon un mode de réalisation de l'invention ; - la figure 4 résume les communications (messages de départ et messages de vérification) nécessaires dans l'exemple de la figure 3 ; - la figure 5 détaille les messages de départ échangés dans l'exemple de la figure 3; - la figure 6 présente la structure d'un encodeur selon un premier mode de réalisation de l'invention ; et - la figure 7 présente la structure d'un encodeur selon un second mode de réalisation de l'invention. 6. DESCRIPTION DÉTAILLÉE Sur toutes les figures du présent document, les éléments et étapes identiques sont désignés par une même référence numérique. On décrit ci-dessous un premier mode de réalisation d'un procédé de codage ou décodage, dans lequel l'image est découpée en bandes verticales et le traitement est effectué ligne par ligne. L'homme du métier pourra aisément transposer cet enseignement pour mettre en oeuvre un second mode de réalisation dans lequel l'image est découpée en bandes horizontales et le traitement est effectué colonne par colonne. Le but de la technique proposée est de répartir le traitement entre N processeurs et M coprocesseurs répartis sur S niveaux. Plus précisément, on a : N > 0, M > 0, N+M >2etS>0. Dans une réalisation particulière, l'invention est appliquée à l'encodage H.264/AVC. Un ensemble de quatre processeurs et de trois coprocesseurs sur deux couches est utilisé. Une couche de deux coprocesseurs permet d'effectuer l'estimation de mouvement. Une couche comportant un seul coprocesseur permet d'effectuer l'estimation des meilleurs modes de prédiction intra. Les quatre processeurs sont en charge du reste du traitement.
La figure 2 illustre le traitement d'une image selon la technique connue décrite dans la demande de brevet WO 2004/100557. On a N=4 processeurs. L'image est découpée en N=4 bandes verticales. Chaque processeur P; est affecté à la bande verticale B;, avec 0 s i s 3. Les flèches référencées 201, 202, 203 et 204 symbolisent le traitement ligne par ligne effectué par les processeurs. Un décalage temporel est appliqué entre chaque bande verticale, afin d'assurer le respect des dépendances entre blocs. Ainsi, sur l'exemple de la figure 2, les blocs gris (14, 26, 38 et 50) indiquent l'avancement de chaque processeur à un instant t. Par exemple, à cet instant t, le bloc 36 n'a pu déjà être traité que si le bloc 35 avait déjà été traité par le processeur PI. Selon la demande de brevet WO 2004/100557, la parallélisation est possible à condition de maintenir le décalage adéquat entre les processeurs tout au long du traitement. Le fonctionnement de cette technique connue est détaillé ci-après.
La figure 3 illustre le traitement d'une image selon un mode de réalisation de l'invention dans lequel il y a : ^ N=2 processeurs,
^ S=2 niveaux de coprocesseurs,
^ M0=3 coprocesseurs sur le niveau s=0,
^ Ms =l coprocesseur sur le niveau s=1.
Tout comme dans la demande de brevet WO 2004/100557, l'image est découpée en bandes de blocs perpendiculairement au sens de traitement des blocs. Ainsi, dans tous nos exemples, les images sont découpées en bandes verticales.
Les notations suivantes, illustrées sur la figure 3, sont utilisées :
^ l'image traitée à une hauteur de H blocs et une largeur de W blocs ;
^ les N processeurs P; sont affectés à N bandes contiguës BP1 de tailles K; blocs, avec 0sisN-1; N-1 ^ ona: Ki =W ; ^ pour tout niveau de coprocesseur s, avec 0 s s s S-1, les Ms coprocesseurs CPs,i sont affectés à ms bandes contiguës BCPs,i de tailles Qs,i blocs ; M,,-1 ^ pour tout s, ona ) s j =W.
On précise sur quelle ligne travaille un processeur ou un coprocesseur avec l'indice de rang r. La ligne BP,, r correspond à la ligne r de la bande BP1 qui sera traitée par le processeur P1. De même, la ligne BCPs,i, r correspond à la ligne r de la bande BCPs,
qui sera traitée par le coprocesseur de niveau s CPs,i. Ainsi, par exemple, toujours dans le cas de la figure 3 :
^ la ligne BP02 2 contient les blocs 24 à 29 ;
^ la ligne BCP0111 1 contient les blocs 16 à 19 ;
^ la ligne BCP1003 3 contient les blocs 36 à 47.
On peut ainsi résumer le fonctionnement de la technique de la demande de brevet WO 2004/100557 (illustrée sur la figure 2) en s'appuyant sur ces notations : 25 - le processeur Po : * traite les Ko - 1 premiers blocs de la ligne BPo, r * vérifie que le premier bloc de la ligne BPI, r_1 a été traité par P1 (si r > 0) ; * traite le dernier bloc de la ligne BPo, r * donne le signal de départ au processeur P1 sur la ligne BPI, r * passe à la ligne suivante BPo, r+1 - le processeur P; (i > 0 ; i < N-1) : * au signal de départ donné par Pi_1 : • traite les K; - 1 premiers blocs de la ligne BP, r • vérifie que le premier bloc de la ligne BP;+1, r_1 a été traité par Pi+1 (si r > 0) • traite le dernier bloc de la ligne BP, r • donne le signal de départ au processeur P;+1 sur la ligne BPi+i, r • attend le signal de Pi_1 pour passer à la ligne suivante BP,, r+1 15 - le processeur P; avec i = N-1 : * au signal de départ donné par Pi_1 : • traite les K; blocs de la ligne BP, r • attend le signal de Pi_1 pour passer à la ligne suivante BP,, r+1 Avec l'exemple d'image de la figure 3, et en prenant N=2 processeurs, le 20 fonctionnement de la technique connue de la demande brevet WO 2004/100557 est résumé dans le tableau suivant : Po P1 BP0,0 Traitement blocs 0-5 Départ BP1,o sur P1 BP0,1 BP1,o Traitement blocs 12-16 Traitement blocs 6-11 Vérification bloc 6 sur P1 Traitement bloc 17 Départ BP1,1 sur P1 BP0,2 BP1,1 Traitement blocs 24-28 Traitement blocs 18-23 Vérification bloc 18 sur P1 Traitement bloc 29 Départ BP1,2 sur P1 15 10 La technique proposée repose sur la gestion d'envoi de messages vers les processeurs et les coprocesseurs selon les règles suivantes : Règle 1 : Message de départ envoyé par un processeur vers un processeur ou par un coprocesseur d'une couche s vers un coprocesseur de la même couche.
Lorsqu'un processeur P;, avec i 0 et i < N-1, a terminé le traitement d'une ligne BP,, r, il envoie un premier message de départ sur la ligne BP;+I, r au processeur P;+l. Ce premier message de départ est connu de la demande de brevet WO 2004/100557. Lorsqu'un coprocesseur CPs, (j 0 ; j < Ms-1) a terminé le traitement d'une ligne BCPs, i, r, il envoie un deuxième message de départ sur la ligne BCPs, i+l, r au coprocesseur CPs,i+I. Ce deuxième message de départ n'est pas connu de la demande de brevet WO 2004/100557. Règle 2 : Message de vérification envoyé par un processeur vers un processeur ou par un coprocesseur d'une couche s vers un coprocesseur de la même couche. Lorsqu'un processeur P; (i 0 ; i < N-1) doit traiter le dernier bloc de la ligne BP,, r (r > 0), il envoie un premier message de vérification au processeur P;+, afin de vérifier si le premier bloc de la ligne BP;+l, r_1 a déjà été traité. Ce premier message de vérification est connu de la demande de brevet WO 2004/100557. Lorsqu'un coprocesseur CPs,3 (j 0 ; j < Ms-1) doit traiter le dernier bloc de la ligne BCPs, j, r (r > 0), il envoie un deuxième message de vérification au coprocesseur CPs, i+1 afin de vérifier si le premier bloc de la ligne BCPs, j+1, r_1 a déjà été traité. Ce deuxième message de vérification n'est pas connu de la demande de brevet WO 2004/100557. Règle 3 : Message de départ envoyé par un coprocesseur vers un processeur. Lorsque le premier bloc de la ligne BCPs, j, r appartient à la ligne BP,, r et le dernier bloc de la ligne BCPs, j, r appartient à la ligne BPi+k, r : - si k est supérieur à 0, ou - si k est égal à 0 et le dernier bloc de la ligne BCPs, j, r est le dernier bloc de la ligne BP,, r, alors lorsque le coprocesseur CPs, a terminé le traitement de la ligne BCPs, j, r' il envoie un troisième message de départ autorisant le processeur pi à traiter la ligne BP,, r. Ce troisième message de départ n'est pas connu de la demande de brevet WO 2004/100557. Règle 4 : Messages de départ attendus par un processeur. Lorsqu'il a terminé la ligne BP,, r, un processeur P; (i > 0 ; i < N) attend un message de P;_1 avant de démarrer la ligne BP,,r+I. Pour tout s : - s'il existe une ligne BCPs, j, r dont le premier bloc est dans la ligne BP,, r, alors il existe k supérieur ou égal à 0 tel que : * la ligne BCPs,;+k, r a au moins un bloc dans la ligne BP,, r * le dernier bloc de la ligne BCPs, j+k, r est le dernier bloc de la ligne BP,, r ou appartient à une autre ligne BP;+,r (v > 0) - le processeur P; doit recevoir un message du coprocesseur CPs, j+k avant de commencer à traiter la ligne BP,,r. Règle 5 : Messages de départ attendus par un coprocesseur. Lorsqu'il a terminé la ligne BCPs,, r, un coprocesseur CPs,3 (j > 0 ; j < Ms) attend un message de CPs,i_i avant de démarrer la ligne BCPs,,, r+i• En appliquant ces règles sur tous les processeurs et coprocesseurs utilisés, on établit la liste des communications (messages de départ et messages de vérification notamment) nécessaires au bon fonctionnement de l'invention. Ainsi, la figure 4 résume les communications (messages de départ et messages de vérification) nécessaires dans l'exemple de la figure 3 (N=2, S=2, M0=3 et M1=1). Les flèches pleines correspondent aux messages de départ (voir la figure 5 pour plus de détails) : la flèche référencée 401 représente les premiers messages de départ, les flèches référencées 402 représentent les deuxièmes messages de départ et les flèches référencées 403 représentent les troisièmes messages de départ. 20 25 Les flèches pointillées correspondent aux messages de vérification : la flèche référencée 404 représente les premiers messages de vérification et les flèches référencées 405 représentent les deuxièmes messages de vérification. On peut ainsi résumer le fonctionnement de la technique proposée : - le processeur Po : * au signal de départ donné par les coprocesseurs (S messages de départ nécessaires) : • traite les Ko - 1 premiers blocs de la ligne BPo, r • vérifie que le premier bloc de la ligne BPI, r_1 a été traité par PI (si r > 0) • traite le dernier bloc de la ligne BPo, r • donne le signal de départ au processeur PI sur la ligne BPI, r • attend les messages de départ des coprocesseurs avant de passer à la ligne suivante BPo, r+1 - le processeur P; (i > 0 ; i < N-1) : * au signal de départ donné par P;_1 et par des coprocesseurs si nécessaire (règle 4) : • traite les K; - 1 premiers blocs de la ligne BP,, r • vérifie que le premier bloc de la ligne BP;+l, r_1 a été traité par P;+~ (si r > 0) • traite le dernier bloc de la ligne BP,, r • donne le signal de départ au processeur P;+, sur la ligne BPi+i, r • attend le signal de P;_1 et des coprocesseurs (si nécessaire) pour passer à la ligne suivante BP,, r+1 - le processeur P; avec i = N-1 : * au signal de départ donné par P;_1 et par des coprocesseurs si nécessaire (règle 4) : • traite les K; blocs de la ligne BP,, r • attend le signal de P;_1 et des coprocesseurs (si nécessaire) pour passer à la ligne suivante BP,, r+1 5 10 15 20 25 pour toute couche de coprocesseur s : * le coprocesseur CPs, o : • traite les Qs, o - 1 premiers blocs de la ligne BCPs, o, r • vérifie que le premier bloc de la ligne BCPs, 1, r_1 a été traité par CPs, I (si r>0) • traite le dernier bloc de la ligne BCPs, o, r • donne le signal de départ au coprocesseur CPs, I sur la ligne BCPs, I, r • donne le signal de départ à un processeur si nécessaire (règle 3) • passe à la ligne suivante BCPs, o, r+i * le coprocesseur CPs,i (j > 0 ; j < Ms - 1) : • au signal de départ donné par CPs,i_I : • traite les Qs, i - 1 premiers blocs de la ligne BCPs,,, r • vérifie que le premier bloc de la ligne BCPs, ;+I, r-I a été traité par CPs,i+I (si r > 0) • traite le dernier bloc de la ligne BCPs,,, r • donne le signal de départ au coprocesseur CPs, i+I sur la ligne BCPs, j+I,r • donne le signal de départ à un processeur si nécessaire (règle 3) • attend le signal de CPs,i_I pour passer à la ligne suivante BCPs,;,r+i * le coprocesseur CPs,i avec j = Ms ù 1 : • au signal de départ donné par CPs,i_I : • traite les Qs,i blocs de la ligne BCPs,, • donne le signal de départ à un processeur (règle 3) • attend le signal de CPs,i_I pour passer à la ligne suivante BCPs,;,r+i Avec l'exemple d'image de la figure 3, et en prenant N=2, S=2, M0=3 et M1=1, le fonctionnement de la technique proposée est résumé dans le tableau suivant : Po Pl CPo,o CPo,1 CPo,z CP1,o BCPo,o,o BCP1,o,o Traitement Traitement blocs 0-3 blocs 0-11 Départ BCPo,I,o Départ BPo,o sur CPo1 I sur Po BCPo,o4 1 BCPo,1,o BCP1,o,1 Traitement Traitement Traitement blocs 12-14 blocs 4-7 blocs 12-23 Vérification Départ BCP0,2,0 Départ BPo,I bloc 4 sur CPo,I sur CPo,2 sur Po Traitement Départ BPo,o bloc 15 sur Po Départ BCPo,1,1 sur CPo1 1 BPo,o BCPo,o,z BCP0,1,1 BCP0,2,0 BCP1,o,2 Traitement Traitement Traitement Traitement Traitement blocs 0-5 blocs 24-26 blocs 16-18 blocs 8-11 blocs 24-35 Départ BPI,o Vérification Vérification Départ BPI,o Départ BP0,2 sur P1 bloc 16 sur CPo,I bloc 8 sur CPo,2 sur P1 sur Po Traitement Traitement bloc 27 bloc 19 Départ BCPo,1,2 Départ BCPo,2,1 sur CPo,I sur CPo,2 Départ BPo,1 sur Po BP0,1 BP1,o BCPo,o,3 BCPo,1,2 BCPo,2,1 BCP1,o,3 Traitement Traitement Traitement Traitement Traitement Traitement blocs 12-16 blocs 6-11 blocs 36-38 blocs 28-30 blocs 20-23 blocs 36-47 Vérification Vérification Vérification Départ BPI,I Départ BPo,3 bloc 6 sur PI bloc 28 sur CPo,I bloc 20 sur sur PI sur Po Traitement Traitement CP0,2 bloc 17 bloc 39 Traitement Départ BPI,1 Départ BCP0,1,3 bloc 31 sur PI sur CPo,I Départ BCP0,2,2 sur CPo,2 Départ BPo,2 sur Po BP0,2 BP1,l BCPo,o,4 BCPo,1,3 BCP0,2,2 BCP1,o,4 Traitement Traitement Traitement Traitement Traitement Traitement blocs 24-28 blocs 18-23 blocs 48-50 blocs 40-42 blocs 32-35 blocs 48-59 Vérification Vérification Vérification Départ BP1,2 Départ BPo,4 bloc 18 sur PI bloc 40 sur CPo,I bloc 32 sur sur PI sur Po Traitement Traitement CP0,2 bloc 29 bloc 51 Traitement Départ BP1,2 Départ BCP0,1,4 bloc 43 sur PI sur CPo,I Départ BCP0,2,3 sur CPo,2 Départ BPo,3 sur Po ... ... ... ... ... ... La figure 5 détaille les messages de départ de ce tableau (c'est-à-dire les premiers 401, deuxièmes 402 et troisièmes 403 messages départ déjà mentionnés dans la description de la figure 4 401, 402 et 403), qui sont échangés dans l'exemple de la figure 3. La figure 6 présente la structure simplifiée d'un dispositif de codage/décodage 600 selon un premier mode de réalisation de l'invention. Ce dispositif comprend un bus de communication 604 auquel sont reliés : ^ une mémoire morte (ROM) 602 ; ^ une mémoire vive (RAM) 603 ; et ^ un ensemble 601 de N processeurs (références Po à PN_1) et M coprocesseurs (références CP0 à CPM_I) répartis sur S niveaux (avec N > 0, M > 0, N+M > 2 et S > 0). La mémoire morte 602 stocke le code exécutable des programmes qui, quand ils sont exécutés par les processeurs et coprocesseurs, permettent la mise en oeuvre de la technique de l'invention, par exemple selon le mode de réalisation dont les règles et le fonctionnement sont décrits ci-dessus en relation avec les figures 3 à 5.
A l'initialisation, les instructions de code des programmes précités sont transférées dans la mémoire vive 603 afin d'être exécutées par les processeurs et coprocesseurs de l'ensemble référencé 601. La mémoire vive 603 comprend également des registres pour mémoriser les variables et paramètres nécessaires à cette exécution. L'ensemble 601 de processeurs et coprocesseurs reçoit en entrée une séquence vidéo à coder 605 et la code sous la forme d'une séquence codée 606, selon les instructions des programmes précités. Le dispositif 600 délivre en sortie la séquence codée 606. Dans ce premier mode de réalisation, les messages de départ et les messages de vérification sont générés par les processeurs et coprocesseurs qui se les envoient directement entre eux.
La figure 7 présente la structure simplifiée d'un dispositif de codage/décodage 700 selon un second mode de réalisation de l'invention. Ce dispositif comprend un bus de communication 704 auquel sont reliés : ^ une mémoire morte (ROM) 702 ; ^ une mémoire vive (RAM) 703 ; ^ un ensemble 701 de N processeurs (références Po à PN_1) et M coprocesseurs (références CP0 à CPM_I) répartis sur S niveaux (avec N > 0, M > 0, N+M > 2 et S>0);et ^ un processeur superviseur 707, qui supervise le fonctionnement de l'ensemble 701 de processeurs et coprocesseurs, et notamment génère et envoie les messages de départ et les messages de vérification, en fonction des informations fournies par les processeurs et coprocesseurs de l'ensemble 701. La mémoire morte 702 stocke le code exécutable des programmes qui, quand ils sont exécutés par le processeur superviseur 707 et l'ensemble 701 de processeurs et coprocesseurs, permettent la mise en oeuvre de la technique de l'invention, par exemple selon une variante du mode de réalisation dont les règles et le fonctionnement sont décrits ci-dessus en relation avec les figures 3 à 5. Le fonctionnement de cette variante est détaillé ci-dessous. A l'initialisation, les instructions de code des programmes précités sont transférées dans la mémoire vive 703 afin d'être exécutées par le processeur superviseur 707 et l'ensemble 701 de processeurs et coprocesseurs. La mémoire vive 703 comprend également des registres pour mémoriser les variables et paramètres nécessaires à cette exécution. Le processeur superviseur 707 et l'ensemble 701 de processeurs et coprocesseurs reçoivent en entrée une séquence vidéo à coder 705 et la codent sous la forme d'une séquence codée 706, selon les instructions des programmes précités. Le dispositif 700 délivre en sortie la séquence codée 706. Dans ce second mode de réalisation, les messages de départ et les messages de vérification sont générés et envoyés par le processeur superviseur 707, à partir d'informations fournies par les processeurs et coprocesseurs de l'ensemble référencé 701. On peut ainsi résumer le fonctionnement de la variante proposée dans ce second mode de réalisation : - le processeur Po : * au signal de départ donné par le processeur superviseur 707 (S messages de départ nécessaires, un par coprocesseur) : • traite les Ko - 1 premiers blocs de la ligne BPo, r • en informe le processeur superviseur 707 afin que ce dernier vérifie que le premier bloc de la ligne BPI, r_1 a été traité par PI (si r > 0) • traite le dernier bloc de la ligne BPo, r • en informe le processeur superviseur 707 afin que ce dernier donne le signal de départ au processeur PI sur la ligne BPI, r • attend les messages de départ du processeur superviseur 707 avant de passer à la ligne suivante BPo, r+1 - le processeur P; (i > 0 ; i < N-1) : * au signal de départ (message(s) de départ) donné par le processeur superviseur 707 à partir d'informations fournies par P;_1 et par des coprocesseurs si nécessaire (équivalent de la règle 4) : • traite les K; - 1 premiers blocs de la ligne BP,, r • en informe le processeur superviseur 707 afin que ce dernier vérifie que le premier bloc de la ligne BP;+l, r_1 a été traité par P;+, (si r > 0) • traite le dernier bloc de la ligne BP,, r • en informe le processeur superviseur 707 afin que ce dernier donne le signal de départ au processeur P;+, sur la ligne BPi+i, r • attend le(s) message(s) de départ) envoyé(s) par le processeur superviseur 707 à partir d'informations fournies par P;_1 et par des coprocesseurs si nécessaire, pour passer à la ligne suivante BP,, r+1 - le processeur P; avec i = N-1 : * au signal de départ (message(s) de départ) donné par le processeur superviseur 707 à partir d'informations fournies par P;_1 et par des coprocesseurs si nécessaire (équivalent de la règle 4) : • traite les K; blocs de la ligne BP,, r • attend le(s) message(s) de départ) envoyé(s) par le processeur superviseur 707 à partir d'informations fournies par P;_1 et par des coprocesseurs si nécessaire, pour passer à la ligne suivante BP,, r+1 - pour toute couche de coprocesseur s : * le coprocesseur CPs, o : 20 25 30 5 10 15 25 • traite les Qs, o - 1 premiers blocs de la ligne BCPs, o, r • en informe le processeur superviseur 707 afin que ce dernier vérifie que le premier bloc de la ligne BCPs, 1, r_1 a été traité par CPs, (si r > 0) • traite le dernier bloc de la ligne BCPs, o, r • en informe le processeur superviseur 707 afin que ce dernier donne le signal de départ au coprocesseur CPs, ~ sur la ligne BCPs, l, r, etdonne le signal de départ à un processeur si nécessaire (équivalent de la règle 3) ; • passe à la ligne suivante BCPs, o, r+i * le coprocesseur CPs,i (j > 0 ; j < Ms - 1) : • au signal de départ donné par le processeur superviseur 707 à partir d'informations fournies par le coprocesseur CPs,i_i • traite les Qs,i - 1 premiers blocs de la ligne BCPs,i,r • en informe le processeur superviseur 707 afin que ce dernier vérifie que le premier bloc de la ligne BCPs,+I, r_1 a été traité par CPs,i+l (si r > 0) • traite le dernier bloc de la ligne BCPs,i,r • en informe le processeur superviseur 707 afin que ce dernier donne le signal de départ au coprocesseur CPs, i+1 sur la ligne BCPs, j+1, r, et donne le signal de départ à un processeur si nécessaire (équivalent de la règle 3) • attend le signal de départ donné par le processeur superviseur 707 à partir d'informations fournies par le coprocesseur CPs, pour passer à la ligne suivante BCPs,,, r+i * le coprocesseur CPs,i avec j = Ms û 1 : • au signal de départ donné par le processeur superviseur 707 à partir d'informations fournies par le coprocesseur CPs,i_i • traite les Qs,i blocs de la ligne BCPs,i,r • en informe le processeur superviseur 707 afin que ce dernier donne le signal de départ à un processeur (équivalent de la règle 3) attend le signal de départ donné par le processeur superviseur 707 à partir d'informations fournies par le coprocesseur CPs, pour passer à la ligne suivante BCPs,i, r+1 Il est clair que de nombreux autres modes de réalisation du dispositif de codage/décodage peuvent être envisagés, sans sortir du cadre de la présente invention. On notera que l'invention ne se limite pas à une implantation purement logicielle, sous la forme d'instructions de programmes informatiques, mais qu'elle peut aussi être mise en oeuvre sous forme matérielle ou toute forme mixant une partie matérielle et une partie logicielle.10