IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

[Parallel Computing Toolbox] Difficulté à créer une boucle parfor


Sujet :

MATLAB

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut [Parallel Computing Toolbox] Difficulté à créer une boucle parfor
    Salut à tous,

    J'ai posté récement sur le forum pour avoir un ptit coup de main sur l'optimisation de mon prog de fitting.
    Depuis il marche très bien, un peu plus vite mais je voulais gagner du temps en multithreadant. Ma version étudiant ne me permet pas d'avoir accès à ces fonctions, mais l'ordi de mon patron a une version de matlab intégrale sur quadcore.
    Du coup j'ai essayé de lancer le prog en remplacant une de mes boucles FOR par PARFOR mais il me retourne en permence une erreur de prog que je n'arrive pas à résoudre.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Algorithme d'extraction compartimentale par fitting %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    clear all;close all;clc;% Vide toute la mÈmoire pour plus de claretÈ
    tic;% Initialise le timer
    slice = 4; % Coupe anatomique ‡ analyser
    %% Place les images en mÈmoire dans une matrice image
    diffIm = zeros(128,128,48) ;
    for i =1:48
        n = i*8 - slice;
        diffIm(:,:,i) = dicomread(sprintf('Diff%03d',n));
    end
     
    % PrÈpare les 6 images paramÈtriques
    res_image=zeros(128,128,6);
     
    % DÈclare les valeurs de b
    XVAL = 0 : 100: 4700  ;
    XVAL = XVAL(:);
     
    % Compteur d'itÈrations
    h = waitbar(0,'Calcul du fitting en cours...');
    steps = 8910;
    step = 1;
    matlabpool close force local
    matlabpool(4)
    % Pour Chaque pixel
    parfor x= 10:119
        for y= 24:104
            %CrÈe un tableau contenant les diffÈrentes valeur du signal en (x,y)
            YVAL = double(diffIm(x,y,:));
     
            % Fit les donnÈes contenues dans le tableau experimentalValue
            paramValue = createFit(XVAL,YVAL);
     
            % InsËre les valeurs des paramËtres retournÈs dans une matrice
            for k=1:6
                res_image(x,y,k) = paramValue(k);
            end
     
            % Affiche le % d'itÈrations de la double boucle dÈja effectuÈ
            step = step+1;
            waitbar(step / steps)
        end
    end
     
    close(h)
    toc
    Voici le message d'erreur :

    Sending a stop signal to all the labs ... stopped.
    Destroying 1 pre-existing parallel job(s) created by matlabpool.

    Starting matlabpool using the 'local' configuration ... connected to 4 labs.
    ??? Error: The variable res_image in a parfor cannot be classified.
    See Parallel for Loops in MATLAB, "Overview".

    Error in ==> Compex at 29
    parfor x= 10:119
    Si l'un de vous à une idée je suis preneur

    A bientôt

  2. #2
    Membre Expert
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Par défaut
    Comme indiqué dans le message d'erreur il faut lire la doc, c'est le résulat attendu que tu obtiens

    La petite note technique:
    Why am I unable to assign values to matrix blocks like A(10:20,i) inside my PARFOR loop in Parallel Computing Toolbox 4.1 (R2009a) ?

    et la doc Overview

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut
    Oui j'ai bien lu la notice
    Si je comprends bien il veut une "sliced variable"
    Alors j'ai modifié dans tous les sens mon prog mais rien n'y fait il me retourne toujours ce message

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut
    Hum, alors j'ai essayé de tout bien déclarer et j'ai mis mon parfor dans la 2ème boucle mais j'obtiens la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    clear all;close all;clc;
    tic;
    slice = 4;
    diffIm = zeros(128,128,48) ;
    for i =1:48
        n = i*8 - slice;
        diffIm(:,:,i) = dicomread(sprintf('Diff%03d',n));
    end
     
    res_image=zeros(128,128,6);
    XVAL = 0 : 100: 4700  ;
    XVAL = XVAL(:);
    h = waitbar(0,'Calcul du fitting en cours...');
    steps = 8910;
    step = 1;
    k=1:6;
    for x=10:119
        parfor y=24:104
            YVAL = double(diffIm(x,y,:));
            paramValue = createFit(XVAL,YVAL);
            res_image(x,y,k) = paramValue(k);
            step = step+1;
            waitbar(step / steps)
        end
    end
    close(h)
    ??? Error: The variable step is
    perhaps intended as a reduction
    variable, but is actually an
    uninitialized temporary.
    See Parallel for Loops in
    MATLAB, "Temporary Variables
    Intended as Reduction
    Variables".

    Error in ==> Compex at 22
    parfor y=24:104
    Je ne vois pas comment je pas réutiliser y entre YVAL et res_image...

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Comme te l'indique le message d'erreur, le problème vient de la variable step. Je ne connais pas bien la parallel computing toolbox mais ça me paraît logique : tu fais des boucles en paralleles, comment veux-tu incrémenter la variable step alors que les boucles sont effectués au même moment?

    Il faut sortir la waitbar de ta boucle parfor, en la mettant dans la boucle for par exemple.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 163
    Par défaut
    Bon alors j'ai revu et simplifé mon code au maximum
    J'ai tout déclaré avant la boucle
    MAIS ca ne marche toujours pas

    Je ne dois pas voir quelque chose ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    clear all;close all;clc;tic;
    matlabpool close force local;
    matlabpool(4);
    slice = 4;
    diffIm = zeros(128,128,48) ;
    for i =1:48
        n = i*8 - slice;
        diffIm(:,:,i) = dicomread(sprintf('Diff%03d',n));
    end
     
    res_image=zeros(128,128,8);
    XVAL =( 0 : 100: 4700).';
    fo_ = fitoptions('method','NonlinearLeastSquares',...
        'MaxFunEvals',600,'MaxIter',400,...
        'Lower',[ 25  25  25 0.00001 0.0015 0.0025 10],...
        'Upper',[255 255 255  0.0015 0.0025 0.0035 14]);
    st_ = [25 75 150 0.001 0.002 0.003 12];
    set(fo_,'Startpoint',st_);
    ft_ = fittype('a1*exp(-b1*x)+a2*exp(-b2*x)+a3*exp(-b3*x)+noise',...
        'dependent',{'y'},'independent',{'x'},...
        'coefficients',{'a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'noise'});
    k=1:7;
    for x_=1:128
        parfor y_=1:128
            YVAL = double(diffIm(x_,y_,:));
            YVAL = YVAL(:);
            res_image(x_,y_,k) = coeffvalues(fit(XVAL,YVAL,ft_,fo_));
        end
    end
     
    toc


    ??? Error using ==>
    parallel_function at 594
    Error in ==> strmatch at 18
    Requires character array or cell
    array of strings as inputs.

    Error in ==> Compex at 29
    parfor y_=1:128

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/12/2011, 21h08
  2. Réponses: 4
    Dernier message: 26/10/2009, 21h43
  3. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48
  4. Comment créer une boucle ?
    Par kikica dans le forum Langage
    Réponses: 5
    Dernier message: 15/03/2006, 21h02
  5. [XSLT]créer une boucle
    Par fraoustin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 11/01/2005, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo