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.
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
Ich warte auf deine Antwort. – nagarwal
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