2016-05-11 5 views
0

Ich habe einen FORTRAN-Code, der den Wert einiger Parameter durch eine Eingabedatei nimmt und davon ausgehend läuft und schließlich ein Bild erzeugt. Später mache ich eine Nachbearbeitung für dieses Bild und berechne einen Wert gemäß meiner Anforderung.Schreiben eines Mutex für den Zugriff auf eine freigegebene Textdatei in MATLAB parfor

Da meine Fortran-Code etwa 20 Sekunden dauert somit ein Bild zu erzeugen, um es schneller, habe ich versucht parfor für einen der Parameter (dep) zu verwenden, so dass ich dist auf separaten Prozessor jede Zeile der Matrix berechnet werden könnte. Das Problem besteht darin, dass jeder Prozessor beim Ausführen dieses Codes versucht, in die Eingabedatei zu schreiben und dadurch untereinander Chaos mit dem Fehler Txt file busy verursacht. Außerdem wird das Programm abnormal gestoppt.

Unten ist mein Code-Abschnitt:

matlabpool open 
gray1 = some_image(8192,200); 

dep = 0.04:0.01:0.40;  % Parameter 1 
vel = 1.47:0.01:1.72;  % Parameter 2 

dist = zeros(length(dep),length(vel)); 

parfor i = 1:length(dep) 

    for j = 1:length(vel) 

     % Updating the Velocities.txt file 
     fid=fopen('input_file.txt','w'); 
     fprintf(fid,'%-5.2f\n%-5.2f',dep(i),vel(j)); 
     fclose(fid); 

     % Compiling and running my fortran code to generate another .dat file 

     system('gfortran code.f -o coderun'); 
     system('./coderun'); 

     % Calling IMAGE_GEN script incorporating the above .dat file 
     system('IMAGE_GEN'); 

     gray2 = some_image(8192,200); 

     % Doing some mathematical calculations and getting a value say 'EucDist' 
     ans(j) = EucDist; 

     display('Calculation finished'); 

     fclose('all'); 
    end 

    dist(i,:) = ans; 

end 
matlabpool close 

end 

Kann jemand bitte machen Sie mir einen Weg ein Mutex für diese write atomare Operation oder jede andere alternative Art und Weise zu schreiben, meinen Skript über die zur Verfügung stehenden 12 Arbeiter zu laufen.

Vielen Dank im Voraus.

Antwort

0

Sie könnten jede parfor Schleife erstellen eine Eingabedatei mit einem anderen Namen.

Sie könnten dann Ihren Fortran-Code ändern, um den Namen der Eingabedatei aus einem Eingabeargument für die Befehlszeile zu lesen.

I enthalten einen Code-Schnipsel ich die Idee unten testen zu:

% Dummy input data; 
dep=[2 4 6 8 4 6 8 4 6 8 4 6 8 4 6 8 4 6 8 4 6 8 4 6 8]; 
vel=[1 2 4 6 8 4 6 8 4 6 8 4 6 8 4 6 8]; 


% Compile the modified fortran code here. 
system('gfortran code.f -o coderun');  

parfor i = 1:length(dep) 
    for j = 1:length(vel) 
    fname=['input_file_' num2str(i) '.txt']; 
    fid=fopen(fname,'w'); 
    fprintf(fid,'%-5.2f\n%-5.2f',dep(i),vel(j)); 
    fclose(fid); 

    % Your other code goes here. 

    % Call the executable 
    system(['./coderun ' fname]); % Pass the filename as an input argument 
    end 
end 

% Clean up the input files 
delete('input_file_*.txt'); 
+0

Es ist eine nette Idee, aber MATLAB wieder Fehler für meinen Fortran-Code '' 'code.f produzieren, sagt' Textdatei ist besetzt '. Ich denke, ich muss verschiedene Kopien meines Fortran-Codes und der entsprechenden '.dat'-Datei erstellen, die nach dem Laufen erzeugt wird, aber das scheint eine langweilige Aufgabe zu sein. Gibt es eine Methode, das zu überwinden? – nagarwal

+0

Ich warte auf deine Antwort. – nagarwal

+0

Ich habe meine vorherige Antwort aktualisiert. Die Datei 'code.f' scheint sich nicht zu ändern, so dass es wahrscheinlich sinnvoller wäre, die Kompilation nur einmal vor der eigentlichen' parfor'-Schleife durchzuführen. – mkfin

Verwandte Themen