{"id":1244,"date":"2026-08-21T14:28:33","date_gmt":"2026-08-21T14:28:33","guid":{"rendered":"https:\/\/matforge.org\/?p=1244","raw":"https:\/\/matforge.org\/?p=1244"},"modified":"2026-08-21T14:28:33","modified_gmt":"2026-08-21T14:28:33","slug":"gpu-accelerated-scientific-computing-cupy-numba-cudf-compared","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/","title":{"rendered":"Informatique scientifique acc\u00e9l\u00e9r\u00e9e par le GPU : CUPY, NUMBA et CUDF compar\u00e9s","raw":"Informatique scientifique acc\u00e9l\u00e9r\u00e9e par le GPU : CUPY, NUMBA et CUDF compar\u00e9s"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li>Cupy est le bon choix lorsque vous souhaitez un remplacement de NumPy ou Scipy qui acc\u00e9l\u00e8re les op\u00e9rations de la baie avec un minimum de modifications de code. Il est optimis\u00e9 pour les math\u00e9matiques en masse, les FFT et les op\u00e9rations par \u00e9l\u00e9ment.<\/li>\n<li>Numba fonctionne mieux lorsque le goulot d&rsquo;\u00e9tranglement est constitu\u00e9 de boucles Python ou de fonctions num\u00e9riques personnalis\u00e9es. Son compilateur JIT transforme le python lent en code de vitesse quasi-c, et <code>@cuda.jit<\/code> vous permet d&rsquo;\u00e9crire des noyaux CUDA qui s&rsquo;ex\u00e9cutent directement sur le GPU.<\/li>\n<li>CUDF est con\u00e7u pour les op\u00e9rations de trame de donn\u00e9es acc\u00e9l\u00e9r\u00e9es par GPU. Si votre flux de travail d\u00e9pend de la fusion, du filtrage ou de l&rsquo;agr\u00e9gation de grands ensembles de donn\u00e9es, CUDF vous donne une API de type Pandas qui s&rsquo;ex\u00e9cute sur du mat\u00e9riel GPU.<\/li>\n<li>Le choix ne s&rsquo;exclut pas mutuellement. Les workflows Fast Scientific Python combinent souvent les trois&nbsp;: CUPY pour les maths Array, Numba pour les noyaux personnalis\u00e9s et CUDF pour la lutte de donn\u00e9es.<\/li>\n<\/ul>\n<p>L&rsquo;acc\u00e9l\u00e9ration des GPU n&rsquo;est plus une pr\u00e9occupation de niche pour les chercheurs en informatique \u00e0 haute performance. Il est devenu pratique pour les simulations scientifiques bas\u00e9es sur Python, les pipelines d&rsquo;analyse de donn\u00e9es et les flux de travail d&rsquo;apprentissage automatique \u00e0 grande \u00e9chelle.<\/p>\n<p>La question n&rsquo;est plus de savoir s&rsquo;il faut utiliser l&rsquo;acc\u00e9l\u00e9ration GPU. La question la plus utile est de savoir quelle biblioth\u00e8que GPU Python correspond \u00e0 votre charge de travail.<\/p>\n<p>Ce guide compare trois principales biblioth\u00e8ques Python acc\u00e9l\u00e9r\u00e9es par GPU&nbsp;: CUPY, NUMBA et CUDF. Il explique leurs architectures, leurs caract\u00e9ristiques de performance et leurs cas d&rsquo;utilisation id\u00e9aux. Que vous ex\u00e9cutiez des simulations PDE, que vous traitiez des jeux de donn\u00e9es exp\u00e9rimentaux ou que vous soyez des mod\u00e8les de formation sur des clusters GPU, cette comparaison peut vous aider \u00e0 choisir le bon outil pour chaque \u00e9tape de votre flux de travail.<\/p>\n<h2>Pourquoi l&rsquo;acc\u00e9l\u00e9ration du GPU est importante en Python scientifique<\/h2>\n<p>Avant de comparer les trois biblioth\u00e8ques, il est utile de comprendre le changement que l&rsquo;acc\u00e9l\u00e9ration du GPU apporte aux flux de travail Python.<\/p>\n<p>Un CPU typique a un petit nombre de c\u0153urs puissants. Les postes de travail modernes ou les n\u0153uds HPC peuvent avoir plusieurs c\u0153urs ou plusieurs dizaines de c\u0153urs. Les GPU ont des milliers de c\u0153urs plus simples optimis\u00e9s pour des charges de travail massivement parall\u00e8les.<\/p>\n<p>Lorsque le code Python peut \u00eatre exprim\u00e9 sous la forme d&rsquo;op\u00e9rations sur de grands tableaux ou des ensembles de donn\u00e9es, les GPU peuvent fournir des acc\u00e9l\u00e9rations majeures. Les avantages les plus importants apparaissent g\u00e9n\u00e9ralement dans les op\u00e9rations matricielles, les FFT, les op\u00e9rations \u00e9l\u00e9mentaires et les grandes charges de travail parall\u00e8les.<\/p>\n<p>Le d\u00e9fi est que l&rsquo;acc\u00e9l\u00e9ration du GPU ajoute de la complexit\u00e9. Vous devez g\u00e9rer la m\u00e9moire \u00e0 travers la RAM CPU et la VRAM du GPU, r\u00e9duire les transferts de donn\u00e9es inutiles et tenir compte des contraintes mat\u00e9rielles.<\/p>\n<p>CUPY, NUMBA et CUDF abordent chacun diff\u00e9remment cette complexit\u00e9.<\/p>\n<h2>Cupy : le drop-in numpy pour les baies de GPU<\/h2>\n<p>Cupy est une biblioth\u00e8que open-source qui impl\u00e9mente un sous-ensemble d&rsquo;API Nvidia et Scipy sur les plateformes NVIDIA CUDA et AMD ROCM. Sa valeur fondamentale est la simplicit\u00e9. Vous pouvez souvent acc\u00e9l\u00e9rer le code Numpy existant en rempla\u00e7ant <code>import numpy as np<\/code> par <code>import cupy as cp<\/code>.<\/p>\n<h3>Comment fonctionne Cupie<\/h3>\n<p>Les tableaux CUPY, ou <code>cupy.ndarray<\/code>, sont stock\u00e9s dans la m\u00e9moire GPU. Les tableaux NumPy vivent dans la RAM syst\u00e8me. La plupart des op\u00e9rations Numpy ont des \u00e9quivalents CUPY qui s&rsquo;ex\u00e9cutent sur le GPU.<\/p>\n<pre><code class=\"language-python\">import cupy as cp\n\n# NumPy-style code with CuPy\na = cp.random.rand(1000, 1000)  # GPU memory\nb = cp.random.rand(1000, 1000)\nc = cp.dot(a, b)  # Matrix multiplication on GPU\n<\/code><\/pre>\n<p>Cupy est soutenu par des biblioth\u00e8ques CUDA telles que Cublas, Cufft, Cusparse, Cusolver et Curand. Il utilise \u00e9galement des noyaux optimis\u00e9s de bas niveau pour fournir de solides performances pour les charges de travail de calcul scientifique courants.<\/p>\n<h3>Points forts<\/h3>\n<ul>\n<li>Remplacement sans rendez-vous. CUPY n\u00e9cessite souvent des changements de code minimes pour les bases de code lourdes.<\/li>\n<li>Couverture API \u00e9tendue. Il met en \u0153uvre de nombreuses API Numpy et Scipy utilis\u00e9es par les projets scientifiques Python.<\/li>\n<li>Prise en charge du ROCM. Cupy peut fonctionner sur les plates-formes GPU AMD prises en charge ainsi que sur les plates-formes NVIDIA CUDA.<\/li>\n<li>Prise en charge multi-GPU. <code>cupyx.distributed<\/code> fournit des primitives de communication collectives et pairs.<\/li>\n<li>Fusion du noyau. Cupy peut combiner plusieurs op\u00e9rations dans un seul noyau GPU pour r\u00e9duire le trafic de m\u00e9moire.<\/li>\n<\/ul>\n<h3>Les faiblesses<\/h3>\n<ul>\n<li>Frais de transfert de donn\u00e9es. Le d\u00e9placement des donn\u00e9es entre la m\u00e9moire CPU et la m\u00e9moire GPU peut dominer le temps d&rsquo;ex\u00e9cution si les transferts sont fr\u00e9quents.<\/li>\n<li>Moins de flexibilit\u00e9 pour les noyaux personnalis\u00e9s. Cupy est le plus fort avec des op\u00e9rations de baies pr\u00e9d\u00e9finies, tandis que les noyaux hautement personnalis\u00e9s peuvent n\u00e9cessiter des travaux suppl\u00e9mentaires.<\/li>\n<li>Contraintes de m\u00e9moire GPU. Les grands maillages 3D peuvent d\u00e9passer la m\u00e9moire du GPU lorsque les champs de solution, les coefficients et les tableaux temporaires sont stock\u00e9s ensemble.<\/li>\n<\/ul>\n<h3>Quand choisir Cupy<\/h3>\n<p>Utilisez Cupy lorsque vous avez d\u00e9j\u00e0 un code NumPy-Heavy et que vous souhaitez une refactorisation minimale.<\/p>\n<p>Les sc\u00e9narios typiques incluent :<\/p>\n<ul>\n<li>Op\u00e9rations matricielles, alg\u00e8bre lin\u00e9aire et FFT.<\/li>\n<li>Op\u00e9rations de tableaux par \u00e9l\u00e9ment sur de grands tableaux contigus.<\/li>\n<li>Bases de code d\u00e9j\u00e0 structur\u00e9es autour des API NumPy ou Scipy.<\/li>\n<\/ul>\n<h2>NUMBA : compilation JIT pour les noyaux et boucles personnalis\u00e9s<\/h2>\n<p>NUMBA est un compilateur JIT open source qui traduit les fonctions Python en code machine optimis\u00e9 lors de l&rsquo;ex\u00e9cution \u00e0 l&rsquo;aide de LLVM. Contrairement \u00e0 Cupy, qui se concentre sur les op\u00e9rations de tableau, Numba acc\u00e9l\u00e8re les boucles Python, les fonctions arithm\u00e9tiques et num\u00e9riques en les compilant dans un code machine efficace.<\/p>\n<h3>Comment fonctionne Numba<\/h3>\n<p>NUMBA utilise des d\u00e9corateurs pour marquer les fonctions pour la compilation.<\/p>\n<pre><code class=\"language-python\">from numba import njit, prange\nimport numpy as np\n\n@njit(parallel=True)\ndef compute_source_terms(phi_values, source_coeff, result):\n    \"\"\"Compute source terms in parallel across all cells.\"\"\"\n    for i in prange(phi_values.shape[0]):\n        result[i] = source_coeff[i] * phi_values[i]**2\n    return result\n<\/code><\/pre>\n<p>Pour l&rsquo;ex\u00e9cution du GPU, NUMBA fournit <code>@cuda.jit<\/code> pour \u00e9crire des noyaux CUDA explicites.<\/p>\n<pre><code class=\"language-python\">from numba import cuda\n\n@cuda.jit\ndef flux_kernel(phi, velocity, flux, nx, ny):\n    \"\"\"CUDA kernel computing fluxes in parallel.\"\"\"\n    i, j = cuda.grid(2)\n    if i &lt; nx and j &lt; ny:\n        idx = i * ny + j\n        flux[idx] = velocity[idx] * phi[idx]\n<\/code><\/pre>\n<h3>Points forts<\/h3>\n<ul>\n<li>Flexibilit\u00e9 maximale. <code>@cuda.jit<\/code> vous permet d&rsquo;\u00e9crire des noyaux CUDA explicites avec un contr\u00f4le sur la m\u00e9moire et le parall\u00e9lisme.<\/li>\n<li>Fonctionne avec le flux de contr\u00f4le Python. NUMBA peut compiler des boucles JIT avec une logique conditionnelle.<\/li>\n<li>Mode double CPU et GPU. Le code peut fonctionner sur CPU via <code>@njit<\/code> ou sur GPU via <code>@cuda.jit<\/code>.<\/li>\n<li>De bonnes performances pour les charges de travail personnalis\u00e9es. NUMBA peut approcher les performances CUDA \u00e9crites \u00e0 la main lorsque le mouvement des donn\u00e9es est minimis\u00e9.<\/li>\n<li>Fonctionne avec les tableaux CUPY. Numba peut lancer des noyaux qui fonctionnent directement sur les donn\u00e9es CUPY.<\/li>\n<\/ul>\n<h3>Les faiblesses<\/h3>\n<ul>\n<li>Courbe d&rsquo;apprentissage plus raide. L&rsquo;\u00e9criture de noyaux CUDA n\u00e9cessite de comprendre la configuration de la grille, les dimensions de bloc, les d\u00e9formations et la disposition de la m\u00e9moire.<\/li>\n<li>Compilation JIT surcharge. La premi\u00e8re ex\u00e9cution comprend le temps de compilation, qui peut aller de secondes \u00e0 plus pour des fonctions complexes.<\/li>\n<li>Divergence des branches. Les GPU ex\u00e9cutent des threads dans les d\u00e9formations. La logique conditionnelle peut faire attendre certains threads pendant que d&rsquo;autres s&rsquo;ex\u00e9cutent.<\/li>\n<\/ul>\n<h3>Quand choisir Numba<\/h3>\n<p>Utilisez NUMBA lorsque le goulot d&rsquo;\u00e9tranglement est des boucles Python, des fonctions num\u00e9riques personnalis\u00e9es ou un parall\u00e9lisme GPU fin.<\/p>\n<p>Les sc\u00e9narios typiques incluent :<\/p>\n<ul>\n<li>Code de boucle lourd avec une logique conditionnelle complexe.<\/li>\n<li>Algorithmes personnalis\u00e9s qui ne correspondent pas proprement aux op\u00e9rations de baies existantes.<\/li>\n<li>Rechercher le code o\u00f9 le r\u00e9glage des performances compte plus que la facilit\u00e9 d&rsquo;utilisation.<\/li>\n<li>Mise \u00e0 l&rsquo;\u00e9chelle multi-GPU o\u00f9 le contr\u00f4le explicite sur l&rsquo;affectation des appareils est important.<\/li>\n<\/ul>\n<h2>CUDF : Op\u00e9rations DataFrame acc\u00e9l\u00e9r\u00e9es par GPU<\/h2>\n<p>CUDF est une biblioth\u00e8que Python GPU DataFrame construite sur le format de m\u00e9moire colonnaire Apache Arrow. Il fournit une API de type Pandas pour la manipulation des donn\u00e9es acc\u00e9l\u00e9r\u00e9es par GPU, ce qui la rend famili\u00e8re aux ing\u00e9nieurs de donn\u00e9es et aux scientifiques des donn\u00e9es.<\/p>\n<h3>Comment fonctionne CUDF<\/h3>\n<p>CUDF fait partie de l&rsquo;\u00e9cosyst\u00e8me NVIDIA Rapids et fournit une interface DataFrame pour les flux de travail acc\u00e9l\u00e9r\u00e9s par GPU.<\/p>\n<pre><code class=\"language-python\">import cudf\n\n# GPU-accelerated DataFrame operations\ndf = cudf.DataFrame({'a': [1, 2, 3], 'b': ['x', 'y', 'z']})\nresult = df.groupby('a').sum()  # Runs on GPU\n<\/code><\/pre>\n<p>CUDF fournit \u00e9galement <code>cudf.pandas<\/code>, qui peut acc\u00e9l\u00e9rer le code Pandas sur le GPU pour les op\u00e9rations prises en charge et retomber sur Pandas lorsqu&rsquo;une op\u00e9ration n&rsquo;est pas prise en charge.<\/p>\n<h3>Points forts<\/h3>\n<ul>\n<li>API famili\u00e8re. L&rsquo;interface de type pandas r\u00e9duit la courbe d&rsquo;apprentissage pour les scientifiques des donn\u00e9es.<\/li>\n<li>Format de m\u00e9moire colonnaire. L&rsquo;architecture bas\u00e9e sur les fl\u00e8ches est optimis\u00e9e pour les charges de travail analytiques.<\/li>\n<li>Op\u00e9rations lourdes de donn\u00e9es. Les op\u00e9rations de fusion, de filtrage, d&rsquo;agr\u00e9gation et de jointure peuvent \u00eatre acc\u00e9l\u00e9r\u00e9es sur le GPU.<\/li>\n<li>Int\u00e9gration rapide. CUDF travaille avec d&rsquo;autres biblioth\u00e8ques Rapids telles que CuGragraph et CuSQL.<\/li>\n<li>repli automatique. <code>cudf.pandas<\/code> peut retomber sur les pandas du CPU lorsque la prise en charge du GPU n&rsquo;est pas disponible pour une op\u00e9ration sp\u00e9cifique.<\/li>\n<\/ul>\n<h3>Les faiblesses<\/h3>\n<ul>\n<li>port\u00e9e \u00e9troite. CUDF se concentre sur les op\u00e9rations DataFrame et n&rsquo;est pas con\u00e7u pour les maths ou les noyaux personnalis\u00e9s.<\/li>\n<li>D\u00e9pendance des rapides. Cela n\u00e9cessite la pile Rapids, qui peut \u00eatre grande \u00e0 installer.<\/li>\n<li>contraintes mat\u00e9rielles. Les limites de m\u00e9moire GPU s&rsquo;appliquent, en particulier pour les grandes jointures, les fusions et les ensembles de donn\u00e9es larges.<\/li>\n<\/ul>\n<h3>Quand choisir CUDF<\/h3>\n<p>Utilisez CUDF lorsque votre flux de travail d\u00e9pend des op\u00e9rations de donn\u00e9es lourdes.<\/p>\n<p>Les sc\u00e9narios typiques incluent :<\/p>\n<ul>\n<li>Fusionner, filtrer ou regrouper de grands ensembles de donn\u00e9es.<\/li>\n<li>Cr\u00e9er des pipelines de donn\u00e9es o\u00f9 l&rsquo;acc\u00e9l\u00e9ration du GPU des op\u00e9rations de trame de donn\u00e9es est importante.<\/li>\n<li>Transition de Pandas sans r\u00e9\u00e9criture de la logique de traitement des donn\u00e9es.<\/li>\n<li>Analyse exploratoire des donn\u00e9es \u00e0 grande \u00e9chelle.<\/li>\n<\/ul>\n<h2>Comparaison : CUPY VS NUMBA VS CUDF<\/h2>\n<p>Le tableau suivant r\u00e9sume les trois biblioth\u00e8ques \u00e0 travers les dimensions cl\u00e9s.<\/p>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Dimensions<\/th>\n<th>cupide<\/th>\n<th>numba<\/th>\n<th>cudf<\/th>\n<\/tr>\n<tr>\n<td>Cas d&rsquo;utilisation principal<\/td>\n<td>Op\u00e9rations de tableau en tant que remplacement de NumPy ou Scipy<\/td>\n<td>Kernels personnalis\u00e9s et acc\u00e9l\u00e9ration de la boucle<\/td>\n<td>Op\u00e9rations DataFrame en remplacement de Pandas<\/td>\n<\/tr>\n<tr>\n<td>Style API<\/td>\n<td>Compatible avec Numpy et Scipy<\/td>\n<td>D\u00e9corateurs Python tels que <code>@njit<\/code> et <code>@cuda.jit<\/code><\/td>\n<td>API DataFrame de type Pandas<\/td>\n<\/tr>\n<tr>\n<td>Courbe d&rsquo;apprentissage<\/td>\n<td>Faible si vous connaissez Numpy<\/td>\n<td>Moyenne parce que les concepts CUDA comptent<\/td>\n<td>Faible si vous connaissez les pandas<\/td>\n<\/tr>\n<tr>\n<td>Mod\u00e8le de m\u00e9moire GPU<\/td>\n<td>Tableaux GPU explicites<\/td>\n<td>Noyaux CUDA explicites<\/td>\n<td>Format de fl\u00e8che en colonne<\/td>\n<\/tr>\n<tr>\n<td>Prise en charge multi-GPU<\/td>\n<td>Oui, via <code>cupyx.distributed<\/code> et NCCL<\/td>\n<td>Oui, via des noyaux multi-GPU explicites<\/td>\n<td>Oui, gr\u00e2ce \u00e0 l&rsquo;\u00e9cosyst\u00e8me Rapids<\/td>\n<\/tr>\n<tr>\n<td>Portabilit\u00e9 CPU\/GPU<\/td>\n<td>Non, principalement orient\u00e9 GPU<\/td>\n<td>Oui, le code peut cibler le CPU ou le GPU<\/td>\n<td>Non, principalement orient\u00e9 GPU<\/td>\n<\/tr>\n<tr>\n<td>Support mat\u00e9riel<\/td>\n<td>NVIDIA CUDA et AMD ROCM<\/td>\n<td>NVIDIA CUDA et CPU<\/td>\n<td>Nvidia Cuda<\/td>\n<\/tr>\n<tr>\n<td>Technologies cl\u00e9s<\/td>\n<td>Cublas, Cufft, Cusparse<\/td>\n<td>Compilateur JIT LLVM<\/td>\n<td>Fl\u00e8che Apache et NCCL<\/td>\n<\/tr>\n<tr>\n<td>le mieux pour<\/td>\n<td>Matrix Math, FFT et op\u00e9rations par \u00e9l\u00e9ment<\/td>\n<td>Algorithmes personnalis\u00e9s et parall\u00e9lisme de boucle<\/td>\n<td>Data Wrangling, jointures et agr\u00e9gations<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Comment combiner les trois flux de travail en un<\/h2>\n<p>Les workflows scientifiques les plus efficaces n&rsquo;ont pas besoin de choisir une seule biblioth\u00e8que. Ils peuvent utiliser les trois de mani\u00e8re strat\u00e9gique.<\/p>\n<p>Un pipeline de recherche typique peut combiner CUPY, NUMBA et CUDF comme ceci&nbsp;:<\/p>\n<ol>\n<li>Ingestion et pr\u00e9traitement des donn\u00e9es avec CUDF. Chargez des ensembles de donn\u00e9es exp\u00e9rimentales, nettoyez les donn\u00e9es et effectuez des agr\u00e9gations et des jointures initiaux.<\/li>\n<li>Simulation ou analyse avec CUPY. D\u00e9placez les donn\u00e9es pr\u00e9trait\u00e9es vers des tableaux GPU et ex\u00e9cutez des op\u00e9rations matricielles, des FFT ou des calculs statistiques.<\/li>\n<li>Ex\u00e9cution du noyau personnalis\u00e9e avec Numba. Si l&rsquo;algorithme a des goulots d&rsquo;\u00e9tranglement lourds en boucle ou une logique personnalis\u00e9e, compilez les sections JIT avec <code>@cuda.jit<\/code>.<\/li>\n<li>Agr\u00e9gation de r\u00e9sultats avec CUDF. Recueillir les r\u00e9sultats dans les trames de donn\u00e9es pour des rapports, une visualisation ou une analyse plus approfondie.<\/li>\n<\/ol>\n<p>Cette approche hybride utilise chaque biblioth\u00e8que l\u00e0 o\u00f9 elle est la plus forte. Par exemple, vous pouvez utiliser CUPY pour la plupart des op\u00e9rations de tableau, ajouter des noyaux Numba pour les boucles serr\u00e9es que CuPy n&rsquo;optimise pas bien et utiliser CUDF pour l&rsquo;agr\u00e9gation des r\u00e9sultats.<\/p>\n<h2>Des pi\u00e8ges courants et comment les \u00e9viter<\/h2>\n<h3>1. Goulots d&rsquo;\u00e9tranglement de transfert de donn\u00e9es<\/h3>\n<p>Le plus gros probl\u00e8me de performances du Python acc\u00e9l\u00e9r\u00e9 par le GPU est souvent le mouvement inutile des donn\u00e9es entre le processeur et la m\u00e9moire du GPU. Chaque transfert sur PCIe est beaucoup plus lent que les op\u00e9rations GPU internes.<\/p>\n<p>Corrigez cela en profilant le code pour identifier les sections lourdes de transfert. Op\u00e9rations par lots afin que les donn\u00e9es se d\u00e9placent une fois vers le GPU, de nombreux calculs s&rsquo;y d\u00e9roulent et seuls les r\u00e9sultats finaux reviennent.<\/p>\n<h3>2. \u00c9puisement de m\u00e9moire GPU<\/h3>\n<p>Les grandes simulations 3D peuvent d\u00e9passer rapidement la m\u00e9moire du GPU. Un maillage avec de nombreuses cellules peut avoir besoin de m\u00e9moire pour les champs de solution, les coefficients, les tableaux temporaires et les diagnostics.<\/p>\n<p>Corrigez cela en utilisant <code>float32<\/code> au lieu de <code>float64<\/code> lorsque le compromis de pr\u00e9cision est acceptable. Le profil avant et apr\u00e8s le changement pour confirmer qu&rsquo;une pr\u00e9cision r\u00e9duite ne compromet pas les r\u00e9sultats.<\/p>\n<h3>3. Divergence des branches dans les noyaux personnalis\u00e9s<\/h3>\n<p>Les GPU ex\u00e9cutent des threads dans les d\u00e9formations. Lorsque les threads divergent en raison de la logique conditionnelle, certains threads peuvent caler tandis que d&rsquo;autres s&rsquo;ex\u00e9cutent.<\/p>\n<p>Corrigez cela en concevant des algorithmes qui minimisent la ramification. Dans la mesure du possible, restructurez les boucles pour \u00e9viter la logique conditionnelle \u00e0 l&rsquo;int\u00e9rieur de sections parall\u00e8les \u00e9troites.<\/p>\n<h3>4. Sur-optimisation<\/h3>\n<p>L&rsquo;acc\u00e9l\u00e9ration du GPU n&rsquo;est pas toujours b\u00e9n\u00e9fique. De petits probl\u00e8mes, des op\u00e9rations li\u00e9es \u00e0 la m\u00e9moire et des structures de donn\u00e9es complexes peuvent effacer les avantages du parall\u00e9lisme GPU.<\/p>\n<p>Corrigez cela en profilant d&rsquo;abord. Acc\u00e9l\u00e9rer uniquement les op\u00e9rations o\u00f9 les benchmarks affichent une acc\u00e9l\u00e9ration significative. Parfois, un simple remplacement de Cupy donne suffisamment de gain sans ajouter plus de complexit\u00e9.<\/p>\n<h2>Quand choisir l&rsquo;outil<\/h2>\n<p>Choisissez Cupy si&nbsp;:<\/p>\n<ul>\n<li>Votre code est d\u00e9j\u00e0 NumPy ou Scipy Heavy.<\/li>\n<li>Vous voulez une refactorisation minimale.<\/li>\n<li>Votre goulot d&rsquo;\u00e9tranglement est constitu\u00e9 d&rsquo;op\u00e9rations de tableau telles que Matrix Math, FFT ou calculs par \u00e9l\u00e9ment.<\/li>\n<li>Vous avez besoin d&rsquo;un support pour les plateformes NVIDIA et AMD GPU.<\/li>\n<\/ul>\n<p>Choisissez Numba si&nbsp;:<\/p>\n<ul>\n<li>Votre goulot d&rsquo;\u00e9tranglement est Python Loops ou des fonctions personnalis\u00e9es.<\/li>\n<li>Vous avez besoin d&rsquo;un contr\u00f4le pr\u00e9cis du parall\u00e9lisme GPU.<\/li>\n<li>Vous impl\u00e9mentez de nouveaux algorithmes \u00e0 partir de z\u00e9ro.<\/li>\n<li>Vous avez besoin d&rsquo;un code qui peut fonctionner \u00e0 la fois sur le processeur et sur le GPU.<\/li>\n<\/ul>\n<p>Choisissez CUDF si&nbsp;:<\/p>\n<ul>\n<li>Votre charge de travail implique des dataframes, des fusions, des jointures ou des agr\u00e9gations.<\/li>\n<li>Vous quittez les pandas et vous souhaitez \u00e9viter de r\u00e9\u00e9crire tout le pipeline.<\/li>\n<li>Vous effectuez une exploration de donn\u00e9es \u00e0 grande \u00e9chelle.<\/li>\n<li>Vous avez besoin d&rsquo;une distorsion de donn\u00e9es acc\u00e9l\u00e9r\u00e9es par GPU.<\/li>\n<\/ul>\n<p>Choisissez les trois si&nbsp;:<\/p>\n<ul>\n<li>Vous \u00eates en train de construire un pipeline de recherche complet avec des phases d&rsquo;ingestion, de simulation et d&rsquo;analyse des donn\u00e9es.<\/li>\n<li>Vous souhaitez combiner des performances solides avec des API famili\u00e8res.<\/li>\n<li>Votre flux de travail s&rsquo;\u00e9tend sur les math\u00e9matiques du tableau, les noyaux personnalis\u00e9s et les op\u00e9rations DataFrame.<\/li>\n<\/ul>\n<h2>Conclusion&nbsp;: Associez l&rsquo;outil \u00e0 la charge de travail<\/h2>\n<p>Il n&rsquo;y a pas de meilleure biblioth\u00e8que Python acc\u00e9l\u00e9r\u00e9e par GPU. Cupy, Numba et CUDF r\u00e9solvent diff\u00e9rents probl\u00e8mes.<\/p>\n<ul>\n<li>Cupy est l&rsquo;outil de style numpy pour acc\u00e9l\u00e9rer les op\u00e9rations de tableau avec un minimum de modifications de code.<\/li>\n<li>Numba est le compilateur JIT flexible pour transformer des boucles lentes en noyaux hautes performances.<\/li>\n<li>CUDF est la biblioth\u00e8que DataFrame qui apporte des op\u00e9rations de style Pandas au mat\u00e9riel GPU.<\/li>\n<\/ul>\n<p>Les flux de travail scientifiques les plus efficaces combinent strat\u00e9giquement les trois. Utilisez chaque outil l\u00e0 o\u00f9 il excelle. Comprendre les compromis entre la facilit\u00e9 d&rsquo;utilisation, les performances, la flexibilit\u00e9 et les contraintes mat\u00e9rielles vous aide \u00e0 cr\u00e9er des flux de travail rapides et maintenables.<\/p>\n<p>Avant de d\u00e9marrer l&rsquo;acc\u00e9l\u00e9ration du GPU, profilez le code pour identifier les goulots d&rsquo;\u00e9tranglement r\u00e9els. Ce n&rsquo;est qu&rsquo;alors que les gains de performances justifieront la complexit\u00e9 de la programmation compatible GPU.<\/p>\n<h2>Lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.cupy.dev\/en\/stable\/\">Documentation CUPY<\/a><\/li>\n<li><a href=\"https:\/\/numba.readthedocs.io\/en\/stable\/cuda\/\">Documentation NUMBA CUDA<\/a><\/li>\n<li><a href=\"https:\/\/docs.rapids.ai\/api\/cudf\/stable\/\">Documentation CUDF<\/a><\/li>\n<li><a href=\"https:\/\/docs.rapids.ai\/\">\u00c9cosyst\u00e8me de Nvidia Rapids<\/a><\/li>\n<li><a href=\"https:\/\/blog.hpc.qmul.ac.uk\/numba-cuda\/\">Architecture du GPU : CPU vs GPU<\/a><\/li>\n<\/ul>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"https:\/\/matforge.org\/gpu-acceleration-for-fipy-simulations-cupy-and-numba-integration-guide\/\">Acc\u00e9l\u00e9ration GPU pour les simulations FIPY&nbsp;: CUPY et NUMBA Integration Guide<\/a> \u2014 couvre CUPY et NUMBA sp\u00e9cifiquement pour FIPY, avec des mod\u00e8les de mise en \u0153uvre pratiques et des conseils de gestion de la m\u00e9moire.<\/li>\n<li><a href=\"https:\/\/matforge.org\/performance-profiling-optimization-python-pde-solvers\/\">Profilage et optimisation des performances des solveurs PDE Python<\/a> Code scientifique bas\u00e9 sur Python et appliquez des optimisations cibl\u00e9es.<\/li>\n<\/ul>\n<h2>FAQ<\/h2>\n<h3>\u00c0 quel point Cupy est-il plus rapide que NumPy&nbsp;?<\/h3>\n<p>CUPY peut acc\u00e9l\u00e9rer consid\u00e9rablement les op\u00e9rations de la baie en fonction de la taille et de la complexit\u00e9 de l&rsquo;op\u00e9ration. Les gains les plus importants apparaissent g\u00e9n\u00e9ralement dans les op\u00e9rations \u00e0 forte intensit\u00e9 de calcul telles que la multiplication matricielle et les FFT. Le gain peut \u00eatre plus petit pour les op\u00e9rations li\u00e9es \u00e0 la m\u00e9moire.<\/p>\n<h3>Cupie peut-il courir sur les GPU AMD ?<\/h3>\n<p>Oui. CUPY prend en charge AMD ROCM sur du mat\u00e9riel compatible, permettant \u00e0 CUPY de s&rsquo;ex\u00e9cuter sur les plates-formes NVIDIA et GPU AMD prises en charge.<\/p>\n<h3>Numba est-il plus rapide que CUPY pour les calculs personnalis\u00e9s ?<\/h3>\n<p>Cela d\u00e9pend de la charge de travail. CUPY est souvent plus rapide pour les op\u00e9rations de baies en bloc avec des noyaux optimis\u00e9s. NUMBA peut \u00eatre plus fort pour les boucles personnalis\u00e9es, la logique conditionnelle ou les algorithmes qui ne correspondent pas parfaitement aux op\u00e9rations de tableau existantes.<\/p>\n<h3>Quelle est la diff\u00e9rence entre CUPY et CUDA ?<\/h3>\n<p>CUDA est le cadre de programmation de niveau inf\u00e9rieur. Cupy est une biblioth\u00e8que Python de haut niveau qui enveloppe la fonctionnalit\u00e9 GPU via une API compatible avec NumPy. Cupy donne une acc\u00e9l\u00e9ration GPU sans vous demander d&rsquo;\u00e9crire directement des noyaux CUDA.<\/p>\n<h3>Quand dois-je utiliser CUDF au lieu de Pandas ?<\/h3>\n<p>Utilisez CUDF lorsque les op\u00e9rations DataFrame sont un goulot d&rsquo;\u00e9tranglement et que le mat\u00e9riel GPU est disponible. Il est utile pour les grandes fusions, jointures, filtres et agr\u00e9gations. Si l&rsquo;ensemble de donn\u00e9es est petit ou si le code n&rsquo;a pas besoin d&rsquo;acc\u00e9l\u00e9ration, Pandas peut \u00eatre plus simple.<\/p>\n<h2>Prochaines \u00e9tapes<\/h2>\n<p>Si vous envisagez une acc\u00e9l\u00e9ration GPU pour les flux de travail Scientific Python, suivez cette s\u00e9quence :<\/p>\n<ol>\n<li>profil d&rsquo;abord. Identifiez les op\u00e9rations qui sont r\u00e9ellement lentes avant d&rsquo;optimiser.<\/li>\n<li>Commencez petit. Essayez le mod\u00e8le de remplacement sans rendez-vous de Cupy sur une seule section NumPy-Heavy.<\/li>\n<li>Benchmark. Comparez les temps d&rsquo;ex\u00e9cution du CPU et du GPU avec des ensembles de donn\u00e9es r\u00e9alistes.<\/li>\n<li>Combinez les biblioth\u00e8ques. Utilisez Cupy pour Array Math, Numba pour les noyaux personnalis\u00e9s et CUDF pour les donn\u00e9es.<\/li>\n<\/ol>\n<p>Pour les \u00e9quipes qui cr\u00e9ent un logiciel de recherche avec des flux de travail Python acc\u00e9l\u00e9r\u00e9s par GPU, l&rsquo;investissement dans la programmation compatible GPU peut r\u00e9duire le temps de simulation, acc\u00e9l\u00e9rer le traitement des donn\u00e9es et prendre en charge des probl\u00e8mes plus importants que les flux de travail uniquement.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li><a href=\"https:\/\/cupy.dev\/#:~:text=Most%20operations%20perform%20well%20on,some%20operations%20more%20than%20100X\">Documentation CUPY<\/a><\/li>\n<li><a href=\"https:\/\/docs.cupy.dev\/en\/stable\/overview.html\">Aper\u00e7u et architecture de CUPY<\/a><\/li>\n<li><a href=\"https:\/\/numba.pydata.org\/\">Documentation de Numba<\/a><\/li>\n<li><a href=\"https:\/\/blog.hpc.qmul.ac.uk\/numba-cuda\/\">Programmation Numba CUDA, blog QMUL HPC<\/a><\/li>\n<li><a href=\"https:\/\/www.mdpi.com\/2079-3197\/12\/3\/61\">Askar et al. 2024 : Exploration de Numba et CUPY pour le transport par rayonnement acc\u00e9l\u00e9r\u00e9 par GPU<\/a><\/li>\n<li><a href=\"https:\/\/dl.acm.org\/doi\/abs\/10.1007\/s10586-025-05422-w\">ASKAR 2025 : \u00c9valuation des capacit\u00e9s de calcul multi-GPU de NUMBA et CUPY<\/a><\/li>\n<li><a href=\"https:\/\/blog.hpc.qmul.ac.uk\/numba-cuda\/\">Blog de QMUL HPC&nbsp;: Explication de la divergence de la branche<\/a><\/li>\n<li><a href=\"https:\/\/docs.rapids.ai\/api\/cudf\/stable\/#why-cudf\">Documentation CUDF : Pourquoi CUDF<\/a><\/li>\n<li><a href=\"https:\/\/matforge.org\/gpu-acceleration-for-fipy-simulations-cupy-and-numba-integration-guide\/\">Matforge : Acc\u00e9l\u00e9ration GPU pour les simulations FIPY<\/a><\/li>\n<\/ul>\n","protected":false,"raw":"<h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li>Cupy est le bon choix lorsque vous souhaitez un remplacement de NumPy ou Scipy qui acc\u00e9l\u00e8re les op\u00e9rations de la baie avec un minimum de modifications de code. Il est optimis\u00e9 pour les math\u00e9matiques en masse, les FFT et les op\u00e9rations par \u00e9l\u00e9ment.<\/li>\n<li>Numba fonctionne mieux lorsque le goulot d'\u00e9tranglement est constitu\u00e9 de boucles Python ou de fonctions num\u00e9riques personnalis\u00e9es. Son compilateur JIT transforme le python lent en code de vitesse quasi-c, et <code>@cuda.jit<\/code> vous permet d'\u00e9crire des noyaux CUDA qui s'ex\u00e9cutent directement sur le GPU.<\/li>\n<li>CUDF est con\u00e7u pour les op\u00e9rations de trame de donn\u00e9es acc\u00e9l\u00e9r\u00e9es par GPU. Si votre flux de travail d\u00e9pend de la fusion, du filtrage ou de l'agr\u00e9gation de grands ensembles de donn\u00e9es, CUDF vous donne une API de type Pandas qui s'ex\u00e9cute sur du mat\u00e9riel GPU.<\/li>\n<li>Le choix ne s'exclut pas mutuellement. Les workflows Fast Scientific Python combinent souvent les trois&nbsp;: CUPY pour les maths Array, Numba pour les noyaux personnalis\u00e9s et CUDF pour la lutte de donn\u00e9es.<\/li>\n<\/ul>\n<p>L'acc\u00e9l\u00e9ration des GPU n'est plus une pr\u00e9occupation de niche pour les chercheurs en informatique \u00e0 haute performance. Il est devenu pratique pour les simulations scientifiques bas\u00e9es sur Python, les pipelines d'analyse de donn\u00e9es et les flux de travail d'apprentissage automatique \u00e0 grande \u00e9chelle.<\/p>\n<p>La question n'est plus de savoir s'il faut utiliser l'acc\u00e9l\u00e9ration GPU. La question la plus utile est de savoir quelle biblioth\u00e8que GPU Python correspond \u00e0 votre charge de travail.<\/p>\n<p>Ce guide compare trois principales biblioth\u00e8ques Python acc\u00e9l\u00e9r\u00e9es par GPU&nbsp;: CUPY, NUMBA et CUDF. Il explique leurs architectures, leurs caract\u00e9ristiques de performance et leurs cas d'utilisation id\u00e9aux. Que vous ex\u00e9cutiez des simulations PDE, que vous traitiez des jeux de donn\u00e9es exp\u00e9rimentaux ou que vous soyez des mod\u00e8les de formation sur des clusters GPU, cette comparaison peut vous aider \u00e0 choisir le bon outil pour chaque \u00e9tape de votre flux de travail.<\/p>\n<h2>Pourquoi l'acc\u00e9l\u00e9ration du GPU est importante en Python scientifique<\/h2>\n<p>Avant de comparer les trois biblioth\u00e8ques, il est utile de comprendre le changement que l'acc\u00e9l\u00e9ration du GPU apporte aux flux de travail Python.<\/p>\n<p>Un CPU typique a un petit nombre de c\u0153urs puissants. Les postes de travail modernes ou les n\u0153uds HPC peuvent avoir plusieurs c\u0153urs ou plusieurs dizaines de c\u0153urs. Les GPU ont des milliers de c\u0153urs plus simples optimis\u00e9s pour des charges de travail massivement parall\u00e8les.<\/p>\n<p>Lorsque le code Python peut \u00eatre exprim\u00e9 sous la forme d'op\u00e9rations sur de grands tableaux ou des ensembles de donn\u00e9es, les GPU peuvent fournir des acc\u00e9l\u00e9rations majeures. Les avantages les plus importants apparaissent g\u00e9n\u00e9ralement dans les op\u00e9rations matricielles, les FFT, les op\u00e9rations \u00e9l\u00e9mentaires et les grandes charges de travail parall\u00e8les.<\/p>\n<p>Le d\u00e9fi est que l'acc\u00e9l\u00e9ration du GPU ajoute de la complexit\u00e9. Vous devez g\u00e9rer la m\u00e9moire \u00e0 travers la RAM CPU et la VRAM du GPU, r\u00e9duire les transferts de donn\u00e9es inutiles et tenir compte des contraintes mat\u00e9rielles.<\/p>\n<p>CUPY, NUMBA et CUDF abordent chacun diff\u00e9remment cette complexit\u00e9.<\/p>\n<h2>Cupy : le drop-in numpy pour les baies de GPU<\/h2>\n<p>Cupy est une biblioth\u00e8que open-source qui impl\u00e9mente un sous-ensemble d'API Nvidia et Scipy sur les plateformes NVIDIA CUDA et AMD ROCM. Sa valeur fondamentale est la simplicit\u00e9. Vous pouvez souvent acc\u00e9l\u00e9rer le code Numpy existant en rempla\u00e7ant <code>import numpy as np<\/code> par <code>import cupy as cp<\/code>.<\/p>\n<h3>Comment fonctionne Cupie<\/h3>\n<p>Les tableaux CUPY, ou <code>cupy.ndarray<\/code>, sont stock\u00e9s dans la m\u00e9moire GPU. Les tableaux NumPy vivent dans la RAM syst\u00e8me. La plupart des op\u00e9rations Numpy ont des \u00e9quivalents CUPY qui s'ex\u00e9cutent sur le GPU.<\/p>\n<pre><code class=\"language-python\">import cupy as cp\n\n# NumPy-style code with CuPy\na = cp.random.rand(1000, 1000)  # GPU memory\nb = cp.random.rand(1000, 1000)\nc = cp.dot(a, b)  # Matrix multiplication on GPU\n<\/code><\/pre>\n<p>Cupy est soutenu par des biblioth\u00e8ques CUDA telles que Cublas, Cufft, Cusparse, Cusolver et Curand. Il utilise \u00e9galement des noyaux optimis\u00e9s de bas niveau pour fournir de solides performances pour les charges de travail de calcul scientifique courants.<\/p>\n<h3>Points forts<\/h3>\n<ul>\n<li>Remplacement sans rendez-vous. CUPY n\u00e9cessite souvent des changements de code minimes pour les bases de code lourdes.<\/li>\n<li>Couverture API \u00e9tendue. Il met en \u0153uvre de nombreuses API Numpy et Scipy utilis\u00e9es par les projets scientifiques Python.<\/li>\n<li>Prise en charge du ROCM. Cupy peut fonctionner sur les plates-formes GPU AMD prises en charge ainsi que sur les plates-formes NVIDIA CUDA.<\/li>\n<li>Prise en charge multi-GPU. <code>cupyx.distributed<\/code> fournit des primitives de communication collectives et pairs.<\/li>\n<li>Fusion du noyau. Cupy peut combiner plusieurs op\u00e9rations dans un seul noyau GPU pour r\u00e9duire le trafic de m\u00e9moire.<\/li>\n<\/ul>\n<h3>Les faiblesses<\/h3>\n<ul>\n<li>Frais de transfert de donn\u00e9es. Le d\u00e9placement des donn\u00e9es entre la m\u00e9moire CPU et la m\u00e9moire GPU peut dominer le temps d'ex\u00e9cution si les transferts sont fr\u00e9quents.<\/li>\n<li>Moins de flexibilit\u00e9 pour les noyaux personnalis\u00e9s. Cupy est le plus fort avec des op\u00e9rations de baies pr\u00e9d\u00e9finies, tandis que les noyaux hautement personnalis\u00e9s peuvent n\u00e9cessiter des travaux suppl\u00e9mentaires.<\/li>\n<li>Contraintes de m\u00e9moire GPU. Les grands maillages 3D peuvent d\u00e9passer la m\u00e9moire du GPU lorsque les champs de solution, les coefficients et les tableaux temporaires sont stock\u00e9s ensemble.<\/li>\n<\/ul>\n<h3>Quand choisir Cupy<\/h3>\n<p>Utilisez Cupy lorsque vous avez d\u00e9j\u00e0 un code NumPy-Heavy et que vous souhaitez une refactorisation minimale.<\/p>\n<p>Les sc\u00e9narios typiques incluent :<\/p>\n<ul>\n<li>Op\u00e9rations matricielles, alg\u00e8bre lin\u00e9aire et FFT.<\/li>\n<li>Op\u00e9rations de tableaux par \u00e9l\u00e9ment sur de grands tableaux contigus.<\/li>\n<li>Bases de code d\u00e9j\u00e0 structur\u00e9es autour des API NumPy ou Scipy.<\/li>\n<\/ul>\n<h2>NUMBA : compilation JIT pour les noyaux et boucles personnalis\u00e9s<\/h2>\n<p>NUMBA est un compilateur JIT open source qui traduit les fonctions Python en code machine optimis\u00e9 lors de l'ex\u00e9cution \u00e0 l'aide de LLVM. Contrairement \u00e0 Cupy, qui se concentre sur les op\u00e9rations de tableau, Numba acc\u00e9l\u00e8re les boucles Python, les fonctions arithm\u00e9tiques et num\u00e9riques en les compilant dans un code machine efficace.<\/p>\n<h3>Comment fonctionne Numba<\/h3>\n<p>NUMBA utilise des d\u00e9corateurs pour marquer les fonctions pour la compilation.<\/p>\n<pre><code class=\"language-python\">from numba import njit, prange\nimport numpy as np\n\n@njit(parallel=True)\ndef compute_source_terms(phi_values, source_coeff, result):\n    \"\"\"Compute source terms in parallel across all cells.\"\"\"\n    for i in prange(phi_values.shape[0]):\n        result[i] = source_coeff[i] * phi_values[i]**2\n    return result\n<\/code><\/pre>\n<p>Pour l'ex\u00e9cution du GPU, NUMBA fournit <code>@cuda.jit<\/code> pour \u00e9crire des noyaux CUDA explicites.<\/p>\n<pre><code class=\"language-python\">from numba import cuda\n\n@cuda.jit\ndef flux_kernel(phi, velocity, flux, nx, ny):\n    \"\"\"CUDA kernel computing fluxes in parallel.\"\"\"\n    i, j = cuda.grid(2)\n    if i &lt; nx and j &lt; ny:\n        idx = i * ny + j\n        flux[idx] = velocity[idx] * phi[idx]\n<\/code><\/pre>\n<h3>Points forts<\/h3>\n<ul>\n<li>Flexibilit\u00e9 maximale. <code>@cuda.jit<\/code> vous permet d'\u00e9crire des noyaux CUDA explicites avec un contr\u00f4le sur la m\u00e9moire et le parall\u00e9lisme.<\/li>\n<li>Fonctionne avec le flux de contr\u00f4le Python. NUMBA peut compiler des boucles JIT avec une logique conditionnelle.<\/li>\n<li>Mode double CPU et GPU. Le code peut fonctionner sur CPU via <code>@njit<\/code> ou sur GPU via <code>@cuda.jit<\/code>.<\/li>\n<li>De bonnes performances pour les charges de travail personnalis\u00e9es. NUMBA peut approcher les performances CUDA \u00e9crites \u00e0 la main lorsque le mouvement des donn\u00e9es est minimis\u00e9.<\/li>\n<li>Fonctionne avec les tableaux CUPY. Numba peut lancer des noyaux qui fonctionnent directement sur les donn\u00e9es CUPY.<\/li>\n<\/ul>\n<h3>Les faiblesses<\/h3>\n<ul>\n<li>Courbe d'apprentissage plus raide. L'\u00e9criture de noyaux CUDA n\u00e9cessite de comprendre la configuration de la grille, les dimensions de bloc, les d\u00e9formations et la disposition de la m\u00e9moire.<\/li>\n<li>Compilation JIT surcharge. La premi\u00e8re ex\u00e9cution comprend le temps de compilation, qui peut aller de secondes \u00e0 plus pour des fonctions complexes.<\/li>\n<li>Divergence des branches. Les GPU ex\u00e9cutent des threads dans les d\u00e9formations. La logique conditionnelle peut faire attendre certains threads pendant que d'autres s'ex\u00e9cutent.<\/li>\n<\/ul>\n<h3>Quand choisir Numba<\/h3>\n<p>Utilisez NUMBA lorsque le goulot d'\u00e9tranglement est des boucles Python, des fonctions num\u00e9riques personnalis\u00e9es ou un parall\u00e9lisme GPU fin.<\/p>\n<p>Les sc\u00e9narios typiques incluent :<\/p>\n<ul>\n<li>Code de boucle lourd avec une logique conditionnelle complexe.<\/li>\n<li>Algorithmes personnalis\u00e9s qui ne correspondent pas proprement aux op\u00e9rations de baies existantes.<\/li>\n<li>Rechercher le code o\u00f9 le r\u00e9glage des performances compte plus que la facilit\u00e9 d'utilisation.<\/li>\n<li>Mise \u00e0 l'\u00e9chelle multi-GPU o\u00f9 le contr\u00f4le explicite sur l'affectation des appareils est important.<\/li>\n<\/ul>\n<h2>CUDF : Op\u00e9rations DataFrame acc\u00e9l\u00e9r\u00e9es par GPU<\/h2>\n<p>CUDF est une biblioth\u00e8que Python GPU DataFrame construite sur le format de m\u00e9moire colonnaire Apache Arrow. Il fournit une API de type Pandas pour la manipulation des donn\u00e9es acc\u00e9l\u00e9r\u00e9es par GPU, ce qui la rend famili\u00e8re aux ing\u00e9nieurs de donn\u00e9es et aux scientifiques des donn\u00e9es.<\/p>\n<h3>Comment fonctionne CUDF<\/h3>\n<p>CUDF fait partie de l'\u00e9cosyst\u00e8me NVIDIA Rapids et fournit une interface DataFrame pour les flux de travail acc\u00e9l\u00e9r\u00e9s par GPU.<\/p>\n<pre><code class=\"language-python\">import cudf\n\n# GPU-accelerated DataFrame operations\ndf = cudf.DataFrame({'a': [1, 2, 3], 'b': ['x', 'y', 'z']})\nresult = df.groupby('a').sum()  # Runs on GPU\n<\/code><\/pre>\n<p>CUDF fournit \u00e9galement <code>cudf.pandas<\/code>, qui peut acc\u00e9l\u00e9rer le code Pandas sur le GPU pour les op\u00e9rations prises en charge et retomber sur Pandas lorsqu'une op\u00e9ration n'est pas prise en charge.<\/p>\n<h3>Points forts<\/h3>\n<ul>\n<li>API famili\u00e8re. L'interface de type pandas r\u00e9duit la courbe d'apprentissage pour les scientifiques des donn\u00e9es.<\/li>\n<li>Format de m\u00e9moire colonnaire. L'architecture bas\u00e9e sur les fl\u00e8ches est optimis\u00e9e pour les charges de travail analytiques.<\/li>\n<li>Op\u00e9rations lourdes de donn\u00e9es. Les op\u00e9rations de fusion, de filtrage, d'agr\u00e9gation et de jointure peuvent \u00eatre acc\u00e9l\u00e9r\u00e9es sur le GPU.<\/li>\n<li>Int\u00e9gration rapide. CUDF travaille avec d'autres biblioth\u00e8ques Rapids telles que CuGragraph et CuSQL.<\/li>\n<li>repli automatique. <code>cudf.pandas<\/code> peut retomber sur les pandas du CPU lorsque la prise en charge du GPU n'est pas disponible pour une op\u00e9ration sp\u00e9cifique.<\/li>\n<\/ul>\n<h3>Les faiblesses<\/h3>\n<ul>\n<li>port\u00e9e \u00e9troite. CUDF se concentre sur les op\u00e9rations DataFrame et n'est pas con\u00e7u pour les maths ou les noyaux personnalis\u00e9s.<\/li>\n<li>D\u00e9pendance des rapides. Cela n\u00e9cessite la pile Rapids, qui peut \u00eatre grande \u00e0 installer.<\/li>\n<li>contraintes mat\u00e9rielles. Les limites de m\u00e9moire GPU s'appliquent, en particulier pour les grandes jointures, les fusions et les ensembles de donn\u00e9es larges.<\/li>\n<\/ul>\n<h3>Quand choisir CUDF<\/h3>\n<p>Utilisez CUDF lorsque votre flux de travail d\u00e9pend des op\u00e9rations de donn\u00e9es lourdes.<\/p>\n<p>Les sc\u00e9narios typiques incluent :<\/p>\n<ul>\n<li>Fusionner, filtrer ou regrouper de grands ensembles de donn\u00e9es.<\/li>\n<li>Cr\u00e9er des pipelines de donn\u00e9es o\u00f9 l'acc\u00e9l\u00e9ration du GPU des op\u00e9rations de trame de donn\u00e9es est importante.<\/li>\n<li>Transition de Pandas sans r\u00e9\u00e9criture de la logique de traitement des donn\u00e9es.<\/li>\n<li>Analyse exploratoire des donn\u00e9es \u00e0 grande \u00e9chelle.<\/li>\n<\/ul>\n<h2>Comparaison : CUPY VS NUMBA VS CUDF<\/h2>\n<p>Le tableau suivant r\u00e9sume les trois biblioth\u00e8ques \u00e0 travers les dimensions cl\u00e9s.<\/p>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>Dimensions<\/th>\n<th>cupide<\/th>\n<th>numba<\/th>\n<th>cudf<\/th>\n<\/tr>\n<tr>\n<td>Cas d'utilisation principal<\/td>\n<td>Op\u00e9rations de tableau en tant que remplacement de NumPy ou Scipy<\/td>\n<td>Kernels personnalis\u00e9s et acc\u00e9l\u00e9ration de la boucle<\/td>\n<td>Op\u00e9rations DataFrame en remplacement de Pandas<\/td>\n<\/tr>\n<tr>\n<td>Style API<\/td>\n<td>Compatible avec Numpy et Scipy<\/td>\n<td>D\u00e9corateurs Python tels que <code>@njit<\/code> et <code>@cuda.jit<\/code><\/td>\n<td>API DataFrame de type Pandas<\/td>\n<\/tr>\n<tr>\n<td>Courbe d'apprentissage<\/td>\n<td>Faible si vous connaissez Numpy<\/td>\n<td>Moyenne parce que les concepts CUDA comptent<\/td>\n<td>Faible si vous connaissez les pandas<\/td>\n<\/tr>\n<tr>\n<td>Mod\u00e8le de m\u00e9moire GPU<\/td>\n<td>Tableaux GPU explicites<\/td>\n<td>Noyaux CUDA explicites<\/td>\n<td>Format de fl\u00e8che en colonne<\/td>\n<\/tr>\n<tr>\n<td>Prise en charge multi-GPU<\/td>\n<td>Oui, via <code>cupyx.distributed<\/code> et NCCL<\/td>\n<td>Oui, via des noyaux multi-GPU explicites<\/td>\n<td>Oui, gr\u00e2ce \u00e0 l'\u00e9cosyst\u00e8me Rapids<\/td>\n<\/tr>\n<tr>\n<td>Portabilit\u00e9 CPU\/GPU<\/td>\n<td>Non, principalement orient\u00e9 GPU<\/td>\n<td>Oui, le code peut cibler le CPU ou le GPU<\/td>\n<td>Non, principalement orient\u00e9 GPU<\/td>\n<\/tr>\n<tr>\n<td>Support mat\u00e9riel<\/td>\n<td>NVIDIA CUDA et AMD ROCM<\/td>\n<td>NVIDIA CUDA et CPU<\/td>\n<td>Nvidia Cuda<\/td>\n<\/tr>\n<tr>\n<td>Technologies cl\u00e9s<\/td>\n<td>Cublas, Cufft, Cusparse<\/td>\n<td>Compilateur JIT LLVM<\/td>\n<td>Fl\u00e8che Apache et NCCL<\/td>\n<\/tr>\n<tr>\n<td>le mieux pour<\/td>\n<td>Matrix Math, FFT et op\u00e9rations par \u00e9l\u00e9ment<\/td>\n<td>Algorithmes personnalis\u00e9s et parall\u00e9lisme de boucle<\/td>\n<td>Data Wrangling, jointures et agr\u00e9gations<\/td>\n<\/tr>\n<\/tbody><\/table>\n<h2>Comment combiner les trois flux de travail en un<\/h2>\n<p>Les workflows scientifiques les plus efficaces n'ont pas besoin de choisir une seule biblioth\u00e8que. Ils peuvent utiliser les trois de mani\u00e8re strat\u00e9gique.<\/p>\n<p>Un pipeline de recherche typique peut combiner CUPY, NUMBA et CUDF comme ceci&nbsp;:<\/p>\n<ol>\n<li>Ingestion et pr\u00e9traitement des donn\u00e9es avec CUDF. Chargez des ensembles de donn\u00e9es exp\u00e9rimentales, nettoyez les donn\u00e9es et effectuez des agr\u00e9gations et des jointures initiaux.<\/li>\n<li>Simulation ou analyse avec CUPY. D\u00e9placez les donn\u00e9es pr\u00e9trait\u00e9es vers des tableaux GPU et ex\u00e9cutez des op\u00e9rations matricielles, des FFT ou des calculs statistiques.<\/li>\n<li>Ex\u00e9cution du noyau personnalis\u00e9e avec Numba. Si l'algorithme a des goulots d'\u00e9tranglement lourds en boucle ou une logique personnalis\u00e9e, compilez les sections JIT avec <code>@cuda.jit<\/code>.<\/li>\n<li>Agr\u00e9gation de r\u00e9sultats avec CUDF. Recueillir les r\u00e9sultats dans les trames de donn\u00e9es pour des rapports, une visualisation ou une analyse plus approfondie.<\/li>\n<\/ol>\n<p>Cette approche hybride utilise chaque biblioth\u00e8que l\u00e0 o\u00f9 elle est la plus forte. Par exemple, vous pouvez utiliser CUPY pour la plupart des op\u00e9rations de tableau, ajouter des noyaux Numba pour les boucles serr\u00e9es que CuPy n'optimise pas bien et utiliser CUDF pour l'agr\u00e9gation des r\u00e9sultats.<\/p>\n<h2>Des pi\u00e8ges courants et comment les \u00e9viter<\/h2>\n<h3>1. Goulots d'\u00e9tranglement de transfert de donn\u00e9es<\/h3>\n<p>Le plus gros probl\u00e8me de performances du Python acc\u00e9l\u00e9r\u00e9 par le GPU est souvent le mouvement inutile des donn\u00e9es entre le processeur et la m\u00e9moire du GPU. Chaque transfert sur PCIe est beaucoup plus lent que les op\u00e9rations GPU internes.<\/p>\n<p>Corrigez cela en profilant le code pour identifier les sections lourdes de transfert. Op\u00e9rations par lots afin que les donn\u00e9es se d\u00e9placent une fois vers le GPU, de nombreux calculs s'y d\u00e9roulent et seuls les r\u00e9sultats finaux reviennent.<\/p>\n<h3>2. \u00c9puisement de m\u00e9moire GPU<\/h3>\n<p>Les grandes simulations 3D peuvent d\u00e9passer rapidement la m\u00e9moire du GPU. Un maillage avec de nombreuses cellules peut avoir besoin de m\u00e9moire pour les champs de solution, les coefficients, les tableaux temporaires et les diagnostics.<\/p>\n<p>Corrigez cela en utilisant <code>float32<\/code> au lieu de <code>float64<\/code> lorsque le compromis de pr\u00e9cision est acceptable. Le profil avant et apr\u00e8s le changement pour confirmer qu'une pr\u00e9cision r\u00e9duite ne compromet pas les r\u00e9sultats.<\/p>\n<h3>3. Divergence des branches dans les noyaux personnalis\u00e9s<\/h3>\n<p>Les GPU ex\u00e9cutent des threads dans les d\u00e9formations. Lorsque les threads divergent en raison de la logique conditionnelle, certains threads peuvent caler tandis que d'autres s'ex\u00e9cutent.<\/p>\n<p>Corrigez cela en concevant des algorithmes qui minimisent la ramification. Dans la mesure du possible, restructurez les boucles pour \u00e9viter la logique conditionnelle \u00e0 l'int\u00e9rieur de sections parall\u00e8les \u00e9troites.<\/p>\n<h3>4. Sur-optimisation<\/h3>\n<p>L'acc\u00e9l\u00e9ration du GPU n'est pas toujours b\u00e9n\u00e9fique. De petits probl\u00e8mes, des op\u00e9rations li\u00e9es \u00e0 la m\u00e9moire et des structures de donn\u00e9es complexes peuvent effacer les avantages du parall\u00e9lisme GPU.<\/p>\n<p>Corrigez cela en profilant d'abord. Acc\u00e9l\u00e9rer uniquement les op\u00e9rations o\u00f9 les benchmarks affichent une acc\u00e9l\u00e9ration significative. Parfois, un simple remplacement de Cupy donne suffisamment de gain sans ajouter plus de complexit\u00e9.<\/p>\n<h2>Quand choisir l'outil<\/h2>\n<p>Choisissez Cupy si&nbsp;:<\/p>\n<ul>\n<li>Votre code est d\u00e9j\u00e0 NumPy ou Scipy Heavy.<\/li>\n<li>Vous voulez une refactorisation minimale.<\/li>\n<li>Votre goulot d'\u00e9tranglement est constitu\u00e9 d'op\u00e9rations de tableau telles que Matrix Math, FFT ou calculs par \u00e9l\u00e9ment.<\/li>\n<li>Vous avez besoin d'un support pour les plateformes NVIDIA et AMD GPU.<\/li>\n<\/ul>\n<p>Choisissez Numba si&nbsp;:<\/p>\n<ul>\n<li>Votre goulot d'\u00e9tranglement est Python Loops ou des fonctions personnalis\u00e9es.<\/li>\n<li>Vous avez besoin d'un contr\u00f4le pr\u00e9cis du parall\u00e9lisme GPU.<\/li>\n<li>Vous impl\u00e9mentez de nouveaux algorithmes \u00e0 partir de z\u00e9ro.<\/li>\n<li>Vous avez besoin d'un code qui peut fonctionner \u00e0 la fois sur le processeur et sur le GPU.<\/li>\n<\/ul>\n<p>Choisissez CUDF si&nbsp;:<\/p>\n<ul>\n<li>Votre charge de travail implique des dataframes, des fusions, des jointures ou des agr\u00e9gations.<\/li>\n<li>Vous quittez les pandas et vous souhaitez \u00e9viter de r\u00e9\u00e9crire tout le pipeline.<\/li>\n<li>Vous effectuez une exploration de donn\u00e9es \u00e0 grande \u00e9chelle.<\/li>\n<li>Vous avez besoin d'une distorsion de donn\u00e9es acc\u00e9l\u00e9r\u00e9es par GPU.<\/li>\n<\/ul>\n<p>Choisissez les trois si&nbsp;:<\/p>\n<ul>\n<li>Vous \u00eates en train de construire un pipeline de recherche complet avec des phases d'ingestion, de simulation et d'analyse des donn\u00e9es.<\/li>\n<li>Vous souhaitez combiner des performances solides avec des API famili\u00e8res.<\/li>\n<li>Votre flux de travail s'\u00e9tend sur les math\u00e9matiques du tableau, les noyaux personnalis\u00e9s et les op\u00e9rations DataFrame.<\/li>\n<\/ul>\n<h2>Conclusion&nbsp;: Associez l'outil \u00e0 la charge de travail<\/h2>\n<p>Il n'y a pas de meilleure biblioth\u00e8que Python acc\u00e9l\u00e9r\u00e9e par GPU. Cupy, Numba et CUDF r\u00e9solvent diff\u00e9rents probl\u00e8mes.<\/p>\n<ul>\n<li>Cupy est l'outil de style numpy pour acc\u00e9l\u00e9rer les op\u00e9rations de tableau avec un minimum de modifications de code.<\/li>\n<li>Numba est le compilateur JIT flexible pour transformer des boucles lentes en noyaux hautes performances.<\/li>\n<li>CUDF est la biblioth\u00e8que DataFrame qui apporte des op\u00e9rations de style Pandas au mat\u00e9riel GPU.<\/li>\n<\/ul>\n<p>Les flux de travail scientifiques les plus efficaces combinent strat\u00e9giquement les trois. Utilisez chaque outil l\u00e0 o\u00f9 il excelle. Comprendre les compromis entre la facilit\u00e9 d'utilisation, les performances, la flexibilit\u00e9 et les contraintes mat\u00e9rielles vous aide \u00e0 cr\u00e9er des flux de travail rapides et maintenables.<\/p>\n<p>Avant de d\u00e9marrer l'acc\u00e9l\u00e9ration du GPU, profilez le code pour identifier les goulots d'\u00e9tranglement r\u00e9els. Ce n'est qu'alors que les gains de performances justifieront la complexit\u00e9 de la programmation compatible GPU.<\/p>\n<h2>Lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.cupy.dev\/en\/stable\/\">Documentation CUPY<\/a><\/li>\n<li><a href=\"https:\/\/numba.readthedocs.io\/en\/stable\/cuda\/\">Documentation NUMBA CUDA<\/a><\/li>\n<li><a href=\"https:\/\/docs.rapids.ai\/api\/cudf\/stable\/\">Documentation CUDF<\/a><\/li>\n<li><a href=\"https:\/\/docs.rapids.ai\/\">\u00c9cosyst\u00e8me de Nvidia Rapids<\/a><\/li>\n<li><a href=\"https:\/\/blog.hpc.qmul.ac.uk\/numba-cuda\/\">Architecture du GPU : CPU vs GPU<\/a><\/li>\n<\/ul>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"https:\/\/matforge.org\/gpu-acceleration-for-fipy-simulations-cupy-and-numba-integration-guide\/\">Acc\u00e9l\u00e9ration GPU pour les simulations FIPY&nbsp;: CUPY et NUMBA Integration Guide<\/a> \u2014 couvre CUPY et NUMBA sp\u00e9cifiquement pour FIPY, avec des mod\u00e8les de mise en \u0153uvre pratiques et des conseils de gestion de la m\u00e9moire.<\/li>\n<li><a href=\"https:\/\/matforge.org\/performance-profiling-optimization-python-pde-solvers\/\">Profilage et optimisation des performances des solveurs PDE Python<\/a> Code scientifique bas\u00e9 sur Python et appliquez des optimisations cibl\u00e9es.<\/li>\n<\/ul>\n<h2>FAQ<\/h2>\n<h3>\u00c0 quel point Cupy est-il plus rapide que NumPy&nbsp;?<\/h3>\n<p>CUPY peut acc\u00e9l\u00e9rer consid\u00e9rablement les op\u00e9rations de la baie en fonction de la taille et de la complexit\u00e9 de l'op\u00e9ration. Les gains les plus importants apparaissent g\u00e9n\u00e9ralement dans les op\u00e9rations \u00e0 forte intensit\u00e9 de calcul telles que la multiplication matricielle et les FFT. Le gain peut \u00eatre plus petit pour les op\u00e9rations li\u00e9es \u00e0 la m\u00e9moire.<\/p>\n<h3>Cupie peut-il courir sur les GPU AMD ?<\/h3>\n<p>Oui. CUPY prend en charge AMD ROCM sur du mat\u00e9riel compatible, permettant \u00e0 CUPY de s'ex\u00e9cuter sur les plates-formes NVIDIA et GPU AMD prises en charge.<\/p>\n<h3>Numba est-il plus rapide que CUPY pour les calculs personnalis\u00e9s ?<\/h3>\n<p>Cela d\u00e9pend de la charge de travail. CUPY est souvent plus rapide pour les op\u00e9rations de baies en bloc avec des noyaux optimis\u00e9s. NUMBA peut \u00eatre plus fort pour les boucles personnalis\u00e9es, la logique conditionnelle ou les algorithmes qui ne correspondent pas parfaitement aux op\u00e9rations de tableau existantes.<\/p>\n<h3>Quelle est la diff\u00e9rence entre CUPY et CUDA ?<\/h3>\n<p>CUDA est le cadre de programmation de niveau inf\u00e9rieur. Cupy est une biblioth\u00e8que Python de haut niveau qui enveloppe la fonctionnalit\u00e9 GPU via une API compatible avec NumPy. Cupy donne une acc\u00e9l\u00e9ration GPU sans vous demander d'\u00e9crire directement des noyaux CUDA.<\/p>\n<h3>Quand dois-je utiliser CUDF au lieu de Pandas ?<\/h3>\n<p>Utilisez CUDF lorsque les op\u00e9rations DataFrame sont un goulot d'\u00e9tranglement et que le mat\u00e9riel GPU est disponible. Il est utile pour les grandes fusions, jointures, filtres et agr\u00e9gations. Si l'ensemble de donn\u00e9es est petit ou si le code n'a pas besoin d'acc\u00e9l\u00e9ration, Pandas peut \u00eatre plus simple.<\/p>\n<h2>Prochaines \u00e9tapes<\/h2>\n<p>Si vous envisagez une acc\u00e9l\u00e9ration GPU pour les flux de travail Scientific Python, suivez cette s\u00e9quence :<\/p>\n<ol>\n<li>profil d'abord. Identifiez les op\u00e9rations qui sont r\u00e9ellement lentes avant d'optimiser.<\/li>\n<li>Commencez petit. Essayez le mod\u00e8le de remplacement sans rendez-vous de Cupy sur une seule section NumPy-Heavy.<\/li>\n<li>Benchmark. Comparez les temps d'ex\u00e9cution du CPU et du GPU avec des ensembles de donn\u00e9es r\u00e9alistes.<\/li>\n<li>Combinez les biblioth\u00e8ques. Utilisez Cupy pour Array Math, Numba pour les noyaux personnalis\u00e9s et CUDF pour les donn\u00e9es.<\/li>\n<\/ol>\n<p>Pour les \u00e9quipes qui cr\u00e9ent un logiciel de recherche avec des flux de travail Python acc\u00e9l\u00e9r\u00e9s par GPU, l'investissement dans la programmation compatible GPU peut r\u00e9duire le temps de simulation, acc\u00e9l\u00e9rer le traitement des donn\u00e9es et prendre en charge des probl\u00e8mes plus importants que les flux de travail uniquement.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li><a href=\"https:\/\/cupy.dev\/#:~:text=Most%20operations%20perform%20well%20on,some%20operations%20more%20than%20100X\">Documentation CUPY<\/a><\/li>\n<li><a href=\"https:\/\/docs.cupy.dev\/en\/stable\/overview.html\">Aper\u00e7u et architecture de CUPY<\/a><\/li>\n<li><a href=\"https:\/\/numba.pydata.org\/\">Documentation de Numba<\/a><\/li>\n<li><a href=\"https:\/\/blog.hpc.qmul.ac.uk\/numba-cuda\/\">Programmation Numba CUDA, blog QMUL HPC<\/a><\/li>\n<li><a href=\"https:\/\/www.mdpi.com\/2079-3197\/12\/3\/61\">Askar et al. 2024 : Exploration de Numba et CUPY pour le transport par rayonnement acc\u00e9l\u00e9r\u00e9 par GPU<\/a><\/li>\n<li><a href=\"https:\/\/dl.acm.org\/doi\/abs\/10.1007\/s10586-025-05422-w\">ASKAR 2025 : \u00c9valuation des capacit\u00e9s de calcul multi-GPU de NUMBA et CUPY<\/a><\/li>\n<li><a href=\"https:\/\/blog.hpc.qmul.ac.uk\/numba-cuda\/\">Blog de QMUL HPC&nbsp;: Explication de la divergence de la branche<\/a><\/li>\n<li><a href=\"https:\/\/docs.rapids.ai\/api\/cudf\/stable\/#why-cudf\">Documentation CUDF : Pourquoi CUDF<\/a><\/li>\n<li><a href=\"https:\/\/matforge.org\/gpu-acceleration-for-fipy-simulations-cupy-and-numba-integration-guide\/\">Matforge : Acc\u00e9l\u00e9ration GPU pour les simulations FIPY<\/a><\/li>\n<\/ul>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Points \u00e0 retenir cl\u00e9s Cupy est le bon choix lorsque vous souhaitez un remplacement de NumPy ou Scipy qui acc\u00e9l\u00e8re les op\u00e9rations de la baie avec un minimum de modifications de code. Il est optimis\u00e9 pour les math\u00e9matiques en masse, les FFT et les op\u00e9rations par \u00e9l\u00e9ment. Numba fonctionne mieux lorsque le goulot d&rsquo;\u00e9tranglement est [&hellip;]<\/p>\n","protected":false,"raw":""},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=367","iawp_total_views":2,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1244","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CUPY VS NUMBA VS CUDF pour GPU Scientific Python<\/title>\n<meta name=\"description\" content=\"Comparez CUPY, NUMBA et CUDF pour GPU Scientific Python, y compris les maths de tableau, les noyaux personnalis\u00e9s, les trames de donn\u00e9es, les pi\u00e8ges et les cas d&#039;utilisation.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CUPY VS NUMBA VS CUDF pour GPU Scientific Python\" \/>\n<meta property=\"og:description\" content=\"Comparez CUPY, NUMBA et CUDF pour GPU Scientific Python, y compris les maths de tableau, les noyaux personnalis\u00e9s, les trames de donn\u00e9es, les pi\u00e8ges et les cas d&#039;utilisation.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:28:33+00:00\" \/>\n<meta name=\"author\" content=\"Elena Markovska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Elena Markovska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/\"},\"author\":{\"name\":\"Elena Markovska\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"headline\":\"Informatique scientifique acc\u00e9l\u00e9r\u00e9e par le GPU : CUPY, NUMBA et CUDF compar\u00e9s\",\"datePublished\":\"2026-08-21T14:28:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/\"},\"wordCount\":3518,\"commentCount\":0,\"articleSection\":[\"Simulation &amp; Projets de mod\u00e9lisation\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/\",\"name\":\"CUPY VS NUMBA VS CUDF pour GPU Scientific Python\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:28:33+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"description\":\"Comparez CUPY, NUMBA et CUDF pour GPU Scientific Python, y compris les maths de tableau, les noyaux personnalis\u00e9s, les trames de donn\u00e9es, les pi\u00e8ges et les cas d'utilisation.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Informatique scientifique acc\u00e9l\u00e9r\u00e9e par le GPU : CUPY, NUMBA et CUDF compar\u00e9s\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\",\"name\":\"Elena Markovska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"caption\":\"Elena Markovska\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/elena-markovska\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CUPY VS NUMBA VS CUDF pour GPU Scientific Python","description":"Comparez CUPY, NUMBA et CUDF pour GPU Scientific Python, y compris les maths de tableau, les noyaux personnalis\u00e9s, les trames de donn\u00e9es, les pi\u00e8ges et les cas d'utilisation.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/","og_locale":"fr_FR","og_type":"article","og_title":"CUPY VS NUMBA VS CUDF pour GPU Scientific Python","og_description":"Comparez CUPY, NUMBA et CUDF pour GPU Scientific Python, y compris les maths de tableau, les noyaux personnalis\u00e9s, les trames de donn\u00e9es, les pi\u00e8ges et les cas d'utilisation.","og_url":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:28:33+00:00","author":"Elena Markovska","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Elena Markovska","Dur\u00e9e de lecture estim\u00e9e":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/"},"author":{"name":"Elena Markovska","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"headline":"Informatique scientifique acc\u00e9l\u00e9r\u00e9e par le GPU : CUPY, NUMBA et CUDF compar\u00e9s","datePublished":"2026-08-21T14:28:33+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/"},"wordCount":3518,"commentCount":0,"articleSection":["Simulation &amp; Projets de mod\u00e9lisation"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/","url":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/","name":"CUPY VS NUMBA VS CUDF pour GPU Scientific Python","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:28:33+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"description":"Comparez CUPY, NUMBA et CUDF pour GPU Scientific Python, y compris les maths de tableau, les noyaux personnalis\u00e9s, les trames de donn\u00e9es, les pi\u00e8ges et les cas d'utilisation.","breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/gpu-accelerated-scientific-computing-cupy-numba-cudf-compared\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Informatique scientifique acc\u00e9l\u00e9r\u00e9e par le GPU : CUPY, NUMBA et CUDF compar\u00e9s"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da","name":"Elena Markovska","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","caption":"Elena Markovska"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/elena-markovska\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1244"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1244\/revisions"}],"predecessor-version":[{"id":1346,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1244\/revisions\/1346"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}