2016-08-24 1 views
0

Je veux accélérer mon algorithme car j'ai besoin de l'exécuter sur des centaines d'images, j'ai donc essayé d'utiliser du code GPU non vectorisé, en exécutant le même code sur GPU, j'ai nvidia Geforce GT 650M avec 2 Go sur mon PC, mais il était très lent que la version CPU. Après une recherche je suis convaincu de passer au code GPU vectorisé en utilisant le traitement par lots (pagefun, bsxfun), j'ai tellement essayé de résoudre ce problème sans solution. Quelqu'un peut-il m'aider à propos de ce code:Accélération de l'algorithme de traitement d'image sur GPU, traitement parallèle Matlab

Q=100; 
     for i=3:n-2 
     for j=3:m-2 
     A(i,j)=0; 
      for c=1:Q 
         if B(i,j,c)~=0 
         A(i,j)=A(i,j)+(-(B(i,j,c)).*log(B(i,j,c))); 
         end 
      end 
     end 
     end 

Une autre question Pourquoi Matlab utilise seulement 20% de mon processeur? Comment puis-je tirer parti de mon processeur pour accélérer mon traitement

Est-ce que Matlab est une application à un seul thread?

Merci à l'avance

Répondre

1

La version vectorisée est la suivante:

BB = B(3:(n-2),3:(m-2),:); 
cutoff = 10^(-6); 
logBB = log(BB); 
logBB(BB<cutoff) = 0; % remove divergent terms 
A = -sum(BB.*logBB,3); 

Cela devrait déjà beaucoup plus vite, même sur un processeur. Si vous avez un GPU, tout ce que vous devez faire est d'avoir le tableau d'entrée

BB = gpuArray(BB); 

stockés sur le GPU, puis recueillir les résultats

A = gather(A); 

Retour à la CPU

+0

GpuArray ne nécessite-t-il pas encore une boîte à outils de calcul parallèle? – zhqiat

+0

Oui, la boîte à outils parallèle est nécessaire pour gpuArray –

+0

Merci beaucoup Airidas Korolkovas, mais je n'ai pas eu une grande amélioration dans le temps d'exécution, l'utilisation de pagefun peut améliorer le temps ou non? J'ai la boîte à outils parallèle. nvidea GT 650M – MAGNETAR

0

Vous aurez besoin d'acheter parallel computing toolbox. (en utilisant parfor).

Il s'agit d'une limitation bien connue de matlab où certaines des fonctions sous-jacentes ne se paralellent pas sur plusieurs cœurs (pas de threads). Une approximation rapide est de regarder combien de CPU matlab utilise et de multiplier cela par le nombre de CORES que vous avez dans votre PC (cela devrait vous amener à quelque part autour de 100%).

Si vous souhaitez utiliser le GPU de votre ordinateur, la boîte à outils de calcul parallèle est le seul moyen de le faire.

De mathworks

Ce dépend vraiment de ce que vous faites. Pour certains codes MATLAB ne peut utiliser qu'un seul cœur d'un seul processeur, pour un autre code, MATLAB utilisera automatiquement tous les cœurs disponibles (et peut-être les processeurs). Cela dépend vraiment des fonctions sous-jacentes. Certaines choses ne peuvent pas être facilement parallélisées. Parfois, vous pouvez aider MATLAB avec des choses comme des boucles parfor. D'autres fois, vous pourriez avoir besoin de quelque chose comme MPI. Encore d'autres fois, il n'y a vraiment rien que vous puissiez faire.

+0

Ce n'est pas Tout à fait correct, vous pouvez ouvrir plusieurs instances de MATLAB, et chacune fonctionnera sur un noyau différent. – EBH

+0

Bon point! Vous avez juste besoin de changer votre code et de diviser vos boucles. – zhqiat

+0

Si l'on envisage d'utiliser 'parfor' et tel, son code devrait être écrit d'une manière qui lui permet de diviser les boucles assez facilement. Sinon, _parallel computing toolbox_ ne l'aidera pas ... – EBH