{"id":5822,"date":"2020-01-28T09:07:07","date_gmt":"2020-01-28T09:07:07","guid":{"rendered":"http:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/?p=5822"},"modified":"2020-01-29T04:41:38","modified_gmt":"2020-01-29T04:41:38","slug":"le-compute-shader-avec-directx11","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=5822","title":{"rendered":"Le Compute Shader avec DirectX 11 (DirectCompute)"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/techcrunch.com\/wp-content\/uploads\/2019\/03\/data-center-tesla-p100-social-media-1200.jpg?w=730&#038;crop=1\" alt=\"GPU\" width=\"350px\" \/><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Pour faire simple, le <strong>compute shader <\/strong> de DirectX 11 permet d&rsquo;effectuer des calculs directement par le processeur de la carte graphique (nomm\u00e9 GPU) alors qu&rsquo;ils auraient pu \u00eatre fait par le CPU (le processeur de la carte-m\u00e8re du PC). Il est d\u00e9nomm\u00e9 par un autre nom : le DirectCompute.<\/p>\n<p>A noter que bien que leur sortie s&rsquo;est faite avec DirectX 11, on peut utiliser les compute shader avec du mat\u00e9riel DirectX 10.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Le compute shader permet le partage de la m\u00e9moire entre processus l\u00e9gers synchronis\u00e9s \u00e0 l&rsquo;int\u00e9rieure de la CG et de la m\u00e9moire de l&rsquo;ordinateur. Il utilise le langage HLSL (High Level Shader Language) classique de DirectX.<\/p>\n<p>En th\u00e9orie on peut calculer n&rsquo;importe quoi. Le compute shader fait office d&rsquo;acc\u00e8s m\u00e9moire en entr\u00e9e \/ sortie par les programmes ex\u00e9cut\u00e9s par le processeur.<\/p>\n<p>Maintenant et depuis l&rsquo;ajout de cette fonctionnalit\u00e9, avec DirectX on peut faire du calcul non graphique en utilisant la CG.<\/p>\n<hr>\n<p>Voici un petit exemple d\u2019initialisation d&rsquo;un compute shader : <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nUINT flags = D3DCOMPILE_ENABLE_STRICTNESS;\r\n\r\n#if defined( DEBUG ) || defined( _DEBUG )\r\nflags |= D3DCOMPILE_DEBUG;\r\n#endif\r\n\r\n\/\/ Prefer higher CS shader profile when possible as CS 5.0 provides better performance on 11-class hardware.\r\nLPCSTR profile = ( device-&gt;GetFeatureLevel() &gt;= D3D_FEATURE_LEVEL_11_0 ) ? &quot;cs_5_0&quot; : &quot;cs_4_0&quot;;\r\n\r\nconst D3D_SHADER_MACRO defines[] = \r\n{\r\n     &quot;EXAMPLE_DEFINE&quot;, &quot;1&quot;,\r\n      NULL, NULL\r\n};\r\n\r\nID3DBlob* shaderBlob = nullptr;\r\nID3DBlob* errorBlob = nullptr;\r\n\r\nHRESULT hr = D3DCompileFromFile( srcFile, defines, D3D_COMPILE_STANDARD_FILE_INCLUDE,\r\n                                     entryPoint, profile,\r\n                                     flags, 0, &amp;shaderBlob, &amp;errorBlob );\r\n<\/pre>\n<p>&#8211; Avec <em>srcFile<\/em> comme le nom du fichier .fx d&rsquo;un compute shader.<br \/>\n&#8211; Avec <em>defines<\/em> comme structure de d\u00e9claration des constantes defines \u00e0 l&rsquo;int\u00e9rieur de l&rsquo;effet.<\/p>\n<p>Quand le compute shader sera ex\u00e9cut\u00e9 dans la m\u00e9moire de la carte graphique, il pourra tirer avantage d&rsquo;un grand nombre d&rsquo;unit\u00e9s d\u2019ex\u00e9cution parall\u00e8les \u00e0 l&rsquo;int\u00e9rieur du GPU.<\/p>\n<p>Qu&rsquo;est-ce qu&rsquo;un \u00ab\u00a0thread group\u00a0\u00bb ?<\/p>\n<p>Un thread group est un groupe d&rsquo;unit\u00e9s d\u2019ex\u00e9cution en parall\u00e8le qui est interpr\u00e9t\u00e9 et con\u00e7u par la CG comme un tableau en 3 dimensions dont chaque membre est un \u00ab\u00a0thread\u00a0\u00bb.<\/p>\n<p>On utilise la m\u00e9thode <strong>ID3D11DeviceContext::Dispatch<\/strong> pour envoyer un \u00ab\u00a0thread group\u00a0\u00bb au GPU. C&rsquo;est-\u00e0-dire qu&rsquo;on utilise cette m\u00e9thode pour faire ex\u00e9cuter des commandes un compute shader.<\/p>\n<p>En effet un compute shader peut \u00eatre ex\u00e9cut\u00e9 sur plusieurs unit\u00e9 d\u2019ex\u00e9cution en parall\u00e8le, le tout formant un \u00ab\u00a0thread group\u00a0\u00bb. On identifie un thread (unit\u00e9 d\u2019ex\u00e9cution parall\u00e8le) en particulier avec un num\u00e9ro d&rsquo;index assimil\u00e9 par un vecteur en 3 dimensions (x, y, z).<\/p>\n<p>Dans cette image illustrant un exemple, la taille des \u00ab\u00a0threads groups\u00a0\u00bb est de 5x5x2, soit 50 groupes d&rsquo;unit\u00e9s d\u2019ex\u00e9cution en parall\u00e8le (\u00ab\u00a0thread\u00a0\u00bb). Ici un thread en particulier est adress\u00e9 par le triplet (4,1,1). A noter que chaque groupe de threads est fait de 16&#215;16 = 256 unit\u00e9 ou threads d\u2019ex\u00e9cution.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/d3d11\/images\/d3d11_thread_group_1.png\" alt=\"Single Thread\" \/><\/p>\n<p>Chaque processus l\u00e9ger (\u00ab\u00a0thread\u00a0\u00bb) peut ex\u00e9cuter plusieurs \u00e9l\u00e9ment de donn\u00e9es \u00e0 travers le compute shader. Et l&rsquo;application C++ qui g\u00e8re tous ces calculs peut d\u00e9finir le nombre de threads en ex\u00e9cution.<\/p>\n<hr>\n<p>La principale capacit\u00e9 des <em>compute shaders<\/em> est le partage et l&rsquo;acc\u00e8s de la m\u00e9moire par plusieurs threads en parall\u00e8le.<\/p>\n<p>Le principe de base du calcul par le biais de ces shaders est l&rsquo;envoi r\u00e9gulier d&rsquo;une grille de threads. Les threads d&rsquo;un m\u00eame groupe s&rsquo;ex\u00e9cute en parall\u00e8le, mais des threads de groupes diff\u00e9rents le peuvent dans certaines conditions.<\/p>\n<p>Les donn\u00e9es accessibles par le compute shader peuvent \u00eatre les Buffers et Textures de DirectX 11.<\/p>\n<hr>\n<p>Les applications au compute shader peuvent \u00eatre : <\/p>\n<p>&#8211; Le traitement d&rsquo;images<br \/>\n&#8211; La construction proc\u00e9durale de mod\u00e8les<br \/>\n&#8211; La physique et l&rsquo;animation<br \/>\n&#8211; Le rendu<br \/>\n&#8211; L&rsquo;intelligence artificielle<br \/>\n&#8211; Les effets de particules<br \/>\n&#8211; Les algorithmes de tri<br \/>\n&#8211; L&rsquo;encodage vid\u00e9o<br \/>\n&#8211; Le calcul scientifique<br \/>\n&#8211; Des effets graphiques tels que : le depth of field, HDR bloom, le motion blur, etc&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Pour faire simple, le compute shader de DirectX 11 permet d&rsquo;effectuer des calculs directement par le processeur de la carte graphique (nomm\u00e9 GPU) alors qu&rsquo;ils auraient pu \u00eatre fait par le CPU (le processeur de la carte-m\u00e8re du PC). Il est d\u00e9nomm\u00e9 par un autre nom : le DirectCompute. A noter que bien [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5822"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5822"}],"version-history":[{"count":58,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5822\/revisions"}],"predecessor-version":[{"id":5975,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5822\/revisions\/5975"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}