2012-04-09 2 views
1

fMRI 뇌 영상 데이터에 대해 연산 집약적 인 연산을 구현하는 수천 줄의 MATLAB 코드가 있습니다. 대부분의 작업은 여러 개의 병렬 스레드에서 실행될 수 있지만 문제는 모든 스레드/작업자의 fprintfdisp 출력이 동일한 창에 인쇄된다는 것입니다.fprintf 및 disp 출력을 다른 parfor worker/threads의 윈도우로 분리

Linux 환경에서 unix 명령을 사용하여 새로운 MATLAB 인스턴스를 생성하는 사용자 정의 멀티 스레딩 코드를 작성했습니다. 따라서, 먼저 .m- 파일 PreprocessSubj1.m, PreprocessSubj2.m, PreprocessSubj3.m 및 PreprocessSubj4.m을 작성합니다. 이들 각각에는 동일한 계산이 포함되어 있지만 다른 주제에는 포함되어 있습니다. 이 4 MATLAB 함수는 서로 완전히 독립적입니다. 내가 MATLAB 스레드를 분기에 대한 unix를 사용하여 생각

CellArrayOfFunctions = { 'PreprocessSubj1', 'PreprocessSubj2', ... 
'PreprocessSubj3', 'PreprocessSubj4' }; 

CellArrayOfFunctions_i = 1; 

while (CellArrayOfFunctions_i <= size(CellArrayOfFunctions, 2)) 
    FunctionToBeRun = CellArrayOfFunctions{CellArrayOfFunctions_i}; 
    unix([ 'matlab -desktop -r ', FunctionToBeRun, ' &' ]); 
    CellArrayOfFunctions_i = CellArrayOfFunctions_i + 1; 
end 

꽤 kludge입니다. 더 나은 유지 보수성과 더 작은 메모리 사용을 위해이 코드를 parfor을 사용하여 구현하고 싶습니다. 그러나 다른 스레드/작업자의 출력을 fprintf (및 disp)의 출력을 다른 윈도우로 리디렉션 할 수있는 방법이 있습니까?

당신을 :) 감사

당신은 아마 # 창을 표시합니다/dev에/점/#에 쓰고 싶은
+0

Matlab에 대해서는 잘 모르겠지만 printf 문에 스레드 ID를 접두어로 붙이고 로그에 쓰는 방법은 없습니까? 그런 다음 로그를 끝내고 스레드 ID를 검색하는 grep에 출력을 파이프하십시오. 관심있는 각 스레드마다 다른 터미널에서이 작업을 수행하십시오. – Duck

+0

저는 각 스레드에 대해 이미 별도의 로그를 작성하고 있지만, 이는 내 자신의 코드에서만 작동합니다. 사용하고있는 MATLAB 도구 상자 (SPM8)의 fprintf 문에는 사용할 수 없습니다. 그러나 MATLAB 내장 fprintf를 내 fprintf.m으로 대체하고 MATLAB 내장 disp에 대해 동일한 작업을 수행하고 "tail -f $ logfilename.txt"로 터미널을 열면이 문제가 해결 될 수 있습니다 . – nrz

답변

2

. 당신은이 작업을 수행 할 수 있습니다 :

output1 = fopen('/dev/pts/0', 'w'); 
output2 = fopen('/dev/pts/1', 'w'); 
fwrite(output1, 'Data to window 1'); 
fwrite(output2, 'Data to window 2'); 

당신은/dev에가/점/어떻게 든하지만 이후에 넣어하는 숫자를 결정해야합니다. 새 터미널을 열 때마다 해당 터미널에 해당하는 새 파일이 표시되므로 !ls /dev/pts으로 어떤 터미널을 사용할 수 있는지 확인할 수 있습니다.

+0

이것은 가능한 해결책이거나 그 일부일 수 있습니다. 고맙습니다. – nrz