Le mois dernier nous avons découvert les maniements de base de l’API OpenCL. Nous abordons aujourd’hui des notions plus avancées telles que la synchronisation des kernels et le profiling des applications
Résumons-nous. OpenCL est une API dédiée à la programmation concurrente et spécifiée par un consortium d’industriels, le Khronos Group. Ce consortium définit également l’API 3D OpenGL et nous ne serons donc pas surpris qu’OpenCL soit proche du graphisme. De fait OpenCL a pour but d’exploiter les possibilités des processeurs multi-coeurs, mais aussi les capacités des processeurs graphiques modernes, qui sont de plus en plus programmables et puissants, et de faire ainsi de votre PC de bureau une vraie bête de calcul.
Une application OpenCL s’articule autour de la notion de Platform, qui est l’implémentation d’OpenCL, de Devices qui sont les composants programmables (CPU, GPU), d’un contexte qui est une abstraction des deux notions précédentes, et d’une file de commande qui dans la terminologie OpenCL est appelée une Command Queue. Dans cette file de commande, le programmeur injecte des instructions de transferts bidirectionnels de données entre le corps de l’application et les Devices. En outre, et c’est l’essence d’une application OpenCL, le programmeur injecte des kernels qui sont de petites routines que le runtime se chargera de répartir sur les coeurs des Devices pour exécution parallèle. Les kernels sont compilés à la volée lors de l’initialisation de l’application. Dans nos exemples du mois dernier, nous nous sommes appuyés sur une particularité d’OpenCL qui est, par défaut, d’assurer que tous les commandes poussées dans la file soient exécutées l’une après l’autre. On peut ainsi voir la file de commande comme une pile FIFO (First In First Out). Les commandes sont exécutées de façon séquentielle et dans ce cas le programmeur n’a pas à se préoccuper de problèmes de synchronisation. Cependant OpenCL permet une autre approche.
Frédéric Mazué