Différences entre les versions de « Jacket »
m (modifié les liens vers accelereye qui a été renommé à arrayfire) |
|||
(21 versions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Catégorie:Logiciels]] | [[Catégorie:Logiciels]] | ||
− | [[Image:Jacket_Logo.png|thumb | + | [[Image:Jacket_Logo.png|thumb]] |
'''Jacket''' est un ''toolbox'' propriétaire pour [[MATLAB|MATLAB]] qui permet l'exécution de code sur GPUs. Similaire à [[GPUmat|GPUmat]], son cousin gratuit, pour sa syntaxe, Jacket comprend cependant davantage de fonctions implémentées et accélère également l'affichage des graphismes 2d ou 3d, en faisant usage du GPU. | '''Jacket''' est un ''toolbox'' propriétaire pour [[MATLAB|MATLAB]] qui permet l'exécution de code sur GPUs. Similaire à [[GPUmat|GPUmat]], son cousin gratuit, pour sa syntaxe, Jacket comprend cependant davantage de fonctions implémentées et accélère également l'affichage des graphismes 2d ou 3d, en faisant usage du GPU. | ||
+ | |||
__TOC__ | __TOC__ | ||
Ligne 9 : | Ligne 10 : | ||
== Guide == | == Guide == | ||
+ | '''Attention''' : Jacket est installé sur les machines '''tigre''' et '''lionceau''' seulement. | ||
− | + | Présentation donnée par Alexandre Desfossés Foucault : http://dms.umontreal.ca/wiki/images/d/d0/PresentationJacket0.pdf | |
− | + | == Exemples == | |
− | + | Dans les exemples suivants, la fonction TIMEIT de Jacket est utilisée afin de chronométrer le temps d'exécution d'un segment de code ou d'une fonction tournant sur CPU ou sur GPU. | |
− | === | + | === Addition matricielle === |
− | |||
<pre> | <pre> | ||
addpath(genpath('/local/jacket-2.3/jacket/engine/')) | addpath(genpath('/local/jacket-2.3/jacket/engine/')) | ||
− | clear; clear gpu_hook; | + | clear; clear gpu_hook; % La mémoire du CPU et celle du GPU sont effacées. |
n=6000 | n=6000 | ||
− | Acpu=rand(n,n,'single'); | + | Acpu=rand(n,n,'single'); % Déclaration de 2 matrices aléatoires (précision simple) sur CPU. |
− | |||
Bcpu=rand(n,n,'single'); | Bcpu=rand(n,n,'single'); | ||
− | Agpu=gsingle(Acpu); % | + | Agpu=gsingle(Acpu); % Copie des matrices précédentes sur GPU. |
− | |||
Bgpu=gsingle(Bcpu); | Bgpu=gsingle(Bcpu); | ||
− | tCpuPlus=timeit(@() Acpu+Bcpu); | + | tCpuPlus=timeit(@() Acpu+Bcpu); % Mesure du temps d'exécution de l'addition des 2 matrices |
− | + | tGpuPlus=timeit(@() Agpu+Bgpu); % pour le CPU et pour le GPU. | |
− | tGpuPlus=timeit(@() Agpu+Bgpu); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | fprintf('Addition: %f\n', tCpuPlus/tGpuPlus); % Comparaison des 2 temps. | ||
− | % | + | % Résultat : « Addition: 17.26681 » |
− | + | % L'opération s'est exécutée 17 fois plus rapidement sur GPU. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | % | ||
− | |||
− | |||
− | |||
</pre> | </pre> | ||
− | === | + | === Multiplication matricielle === |
<pre> | <pre> | ||
addpath(genpath('/local/jacket-2.3/jacket/engine/')) | addpath(genpath('/local/jacket-2.3/jacket/engine/')) | ||
− | + | clear; clear gpu_hook; % La mémoire du CPU et celle du GPU sont effacées. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | clear; clear gpu_hook; | ||
− | |||
− | % | ||
minSize = 100; maxSize = 2000; it = 100; | minSize = 100; maxSize = 2000; it = 100; | ||
− | |||
sizes = minSize:it:maxSize; | sizes = minSize:it:maxSize; | ||
− | |||
nbSizes = length(sizes); | nbSizes = length(sizes); | ||
− | |||
timeMultGPU = zeros(nbSizes,1); | timeMultGPU = zeros(nbSizes,1); | ||
− | |||
timeMultCPU = zeros(nbSizes,1); | timeMultCPU = zeros(nbSizes,1); | ||
Ligne 243 : | Ligne 60 : | ||
G1=grand(currentSize); G2=grand(currentSize); | G1=grand(currentSize); G2=grand(currentSize); | ||
− | |||
G3=double(G1); G4=double(G2); | G3=double(G1); G4=double(G2); | ||
timeMultGPU(currentTest) = timeit(@() G1*G2); | timeMultGPU(currentTest) = timeit(@() G1*G2); | ||
− | |||
timeMultCPU(currentTest) = timeit(@() G3*G4); | timeMultCPU(currentTest) = timeit(@() G3*G4); | ||
Ligne 254 : | Ligne 69 : | ||
end | end | ||
− | timeMultGPU | + | timeMultGPU % Le temps calculé pour le GPU. |
− | + | timeMultCPU % Le temps calculé pour le CPU. | |
− | timeMultCPU | ||
− | |||
− | |||
− | + | timeMultCPU/timeMultGPU % Le rapport des 2 temps. | |
+ | plot(minSize:it:maxSize,timeMultGPU,'-or') % Affichage des temps sur graphique. | ||
hold on | hold on | ||
− | |||
plot(minSize:it:maxSize,timeMultCPU,'-xb') | plot(minSize:it:maxSize,timeMultCPU,'-xb') | ||
set(gca,'FontSize',16) | set(gca,'FontSize',16) | ||
+ | title('Temps de calcul GPU vs CPU pour la multiplication matricielle') | ||
+ | xlabel('Taille des matrices') | ||
+ | ylabel('Temps de calcul (s)') | ||
+ | legend('GPU','CPU','Location','NorthWest') | ||
+ | </pre> | ||
− | + | === Boucle <tt>gfor</tt> === | |
+ | Dans cet exemple, plusieurs itérations d'une boucle sont exécutées simultanément sur le GPU par la commande <tt>gfor</tt>. Ceci est possible ici puisque les itérations sont indépendantes les unes des autres. | ||
− | + | <pre> | |
+ | clear; clear gpu_hook; % La mémoire du CPU et celle du GPU sont effacées. | ||
− | + | addpath(genpath('/local/jacket-2.3/jacket/engine/')) | |
− | + | n=5; m=20; | |
− | + | A = grand(n,n,m); % On crée un tableau sur le GPU qui contient m matrices n x n aléatoires. | |
+ | B = gones(n); | ||
+ | gfor p = 1:m | ||
+ | A(:,:,p) = A(:,:,p) * B | ||
+ | gend | ||
+ | </pre> | ||
== Voir aussi == | == Voir aussi == | ||
Ligne 290 : | Ligne 114 : | ||
=== Références externes === | === Références externes === | ||
− | * [ | + | * [https://arrayfire.com/ Site officiel de Jacket] |
− | * [ | + | * [https://en.wikipedia.org/wiki/ArrayFire Jacket (remplaçé par Arrayfire) sur Wikipédia] |
Version actuelle datée du 12 mai 2020 à 13:41
Jacket est un toolbox propriétaire pour MATLAB qui permet l'exécution de code sur GPUs. Similaire à GPUmat, son cousin gratuit, pour sa syntaxe, Jacket comprend cependant davantage de fonctions implémentées et accélère également l'affichage des graphismes 2d ou 3d, en faisant usage du GPU.
Guide
Attention : Jacket est installé sur les machines tigre et lionceau seulement.
Présentation donnée par Alexandre Desfossés Foucault : http://dms.umontreal.ca/wiki/images/d/d0/PresentationJacket0.pdf
Exemples
Dans les exemples suivants, la fonction TIMEIT de Jacket est utilisée afin de chronométrer le temps d'exécution d'un segment de code ou d'une fonction tournant sur CPU ou sur GPU.
Addition matricielle
addpath(genpath('/local/jacket-2.3/jacket/engine/')) clear; clear gpu_hook; % La mémoire du CPU et celle du GPU sont effacées. n=6000 Acpu=rand(n,n,'single'); % Déclaration de 2 matrices aléatoires (précision simple) sur CPU. Bcpu=rand(n,n,'single'); Agpu=gsingle(Acpu); % Copie des matrices précédentes sur GPU. Bgpu=gsingle(Bcpu); tCpuPlus=timeit(@() Acpu+Bcpu); % Mesure du temps d'exécution de l'addition des 2 matrices tGpuPlus=timeit(@() Agpu+Bgpu); % pour le CPU et pour le GPU. fprintf('Addition: %f\n', tCpuPlus/tGpuPlus); % Comparaison des 2 temps. % Résultat : « Addition: 17.26681 » % L'opération s'est exécutée 17 fois plus rapidement sur GPU.
Multiplication matricielle
addpath(genpath('/local/jacket-2.3/jacket/engine/')) clear; clear gpu_hook; % La mémoire du CPU et celle du GPU sont effacées. minSize = 100; maxSize = 2000; it = 100; sizes = minSize:it:maxSize; nbSizes = length(sizes); timeMultGPU = zeros(nbSizes,1); timeMultCPU = zeros(nbSizes,1); currentTest = 1; for currentSize = minSize:it:maxSize G1=grand(currentSize); G2=grand(currentSize); G3=double(G1); G4=double(G2); timeMultGPU(currentTest) = timeit(@() G1*G2); timeMultCPU(currentTest) = timeit(@() G3*G4); currentTest = currentTest + 1; end timeMultGPU % Le temps calculé pour le GPU. timeMultCPU % Le temps calculé pour le CPU. timeMultCPU/timeMultGPU % Le rapport des 2 temps. plot(minSize:it:maxSize,timeMultGPU,'-or') % Affichage des temps sur graphique. hold on plot(minSize:it:maxSize,timeMultCPU,'-xb') set(gca,'FontSize',16) title('Temps de calcul GPU vs CPU pour la multiplication matricielle') xlabel('Taille des matrices') ylabel('Temps de calcul (s)') legend('GPU','CPU','Location','NorthWest')
Boucle gfor
Dans cet exemple, plusieurs itérations d'une boucle sont exécutées simultanément sur le GPU par la commande gfor. Ceci est possible ici puisque les itérations sont indépendantes les unes des autres.
clear; clear gpu_hook; % La mémoire du CPU et celle du GPU sont effacées. addpath(genpath('/local/jacket-2.3/jacket/engine/')) n=5; m=20; A = grand(n,n,m); % On crée un tableau sur le GPU qui contient m matrices n x n aléatoires. B = gones(n); gfor p = 1:m A(:,:,p) = A(:,:,p) * B gend