نحوه كار با Distributed Computing Toolbox بطور خلاصه:
پيش از شروع كار با اين جعبه ابزار بايد آنرا نصب كنيد. ضمنا توجه داشته باشيد كه MATLAT نسخه 7.0.4 يا بالاتر (اگر به بازار آمده است) روي تمام كامپيوترها نصب شده باشد. حالا در خط فرمان (cmd) اين دستورات را تايپ كنيد:
cd MATLABROOT\toolbox\distcomp\bin\win32
mdce install
پس از اجراي دستور فوق، سرويس mdce نصب ميشود و هر بار با بالا آمدن سيستم عامل، شروع ميشود. ميتوانيد اين موضوع را اينجا چك كنيد (Control Panel->Administrative Tools->Services). سرويسي به اسم MATLAB Distributed Computing Engine Service خواهيد ديد كه مربوط به همين جعبه ابزار است. اگر سرويس فوق شروع نشده باشد، به سادگي و با تايپ mdce start در خط فرمان و آدرس بالا (MATLABROOT\toolbox\distcomp\bin\win32) شروعش كنيد. من و سيب قبلا توي اتاق ICT اين كار را انجام داديم ولي اگر باز هم مشكلي بود، به سيب مراجعه كنيد (چون بيشتر از من توي بخش ديده ميشه).
بهتر است اول كمي در مورد كلماتي كه در ادامه ميبينيد، توضيح بدهم. در اينجا، به يك برنامه توزيع شده، job گفته ميشود كه اداره آن به عهده jobmanager ميباشد. هر job به قسمتهايي به نام task تقسيم ميشود كه ميتوانند بصورت مجزا و همزمان روي كامپيوترهاي مختلف اجرا بشوند. سپس jobmanager، هر task را براي اجرا به يك worker ميفرستد. پس روي هر كامپيوتر بايد حداقل يك سرويس worker اجرا شده باشد. بديهيست كه شبكه احتياج به حداقل يك jobmanager دارد و هر jobmanager هم حداقل به يك worker نياز دارد. ابتدا بايد jobmanager اجرا شود، پس در خط فرمان تايپ كنيد (با همان آدرس قبلي):
startjobmanager -name MyJobManager
با اين دستور يك jobmanager به نام MyJobManager، شروع به كار ميكند. حالا روي هر كامپيوتر يك worker راهاندازي كنيد (به ياد داشته باشيد كه براي اجراي يك برنامه توزيع شده تحت MATLAB نيازي نيست كه همه جا MATLAB در حال اجرا باشد، ولي نصب MATLAB روي همه كامپيوترها الزاميست):
startworker -jobmanager MyJobManager
با اجرا اين دستور در هر كامپيوتر يك worker متعلق به jobmanagerي به نام MyJobManager، شروع خواهد شد. اگر بخواهيد در يك كامپيوتر بيش از يك worker براي يك jobmanager يكسان داشته باشيد با سويچ name- به هر كدام يك اسم يكتا بدهيد. ضمنا فراموش نكنيد كه پس از اتمام كار، اجراي workerها و jobmanager ها رو متوقف كنيد:
stopworker
stopjobmanager -name MyJobManager
حالا نوبت برنامه نويسي است. MATLAB را اجرا كنيد و در پنجره فرمان، يك jobmanager در شبكه پيدا كنيد:
all_managers = findResource('jobmanager')
jm = all_managers(1)
اگر به دنبال يك jobmanager با نام خاصي هستيد، اين دستور پيشنهاد ميشود:
jm = findResource('jobmanager', 'Name', 'MyJobManager')
با اجراي دستور مفيد زير:
get(jm)
خصوصيات jm از جمله تعداد workerها و وضعيت آنها را ميتوان مشاهده نمود.
حالا يك job درون jm بسازيد:
job1 = createJob(jm)
ميتوان مشخصات job1 را هم ديد:
get(job1)
ميبينيد كه وضعيت job1 فعلا pending است. با دستورات زير، چند task درون job1 ايجاد كنيد:
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
createTask(job1, @rand, 1, {3,3});
و بعد:
submit(job1)
با دستور زير نتيجه اجراي job1 را ببينيد:
results = getAllOutputArguments(job1);
for i = 1:5
disp(results{i})
end
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
0.4447 0.9218 0.4057
0.6154 0.7382 0.9355
0.7919 0.1763 0.9169
0.4103 0.3529 0.1389
0.8936 0.8132 0.2028
0.0579 0.0099 0.1987
0.6038 0.0153 0.9318
0.2722 0.7468 0.4660
0.1988 0.4451 0.4186
0.8462 0.6721 0.6813
0.5252 0.8381 0.3795
0.2026 0.0196 0.8318
تابع مفيد ديگري هم به نام dfeval وجود دارد كه در صورتي كه تمام taskها مربوط به اجراي تابعي يكسان باشند، بهتر است از آن استفاده كنيد:
y = dfeval(@rand,{1 2 3})
y =
[ 0.9501]
[2x2 double]
[3x3 double]
ميبينيد كه ديگري نيازي به تعريف job و task نيست. اما اين تابع پنجره فرمان MATLAB را تا اجراي كامل قفل ميكند، پس اگر خواستيد همزمان با اجراي برنامه خود بتوانيد با پنجره فرمان كار كنيد، از تابع dfevalasync استفاده كنيد. با اين تفاوت كه بايد پيش از درخواست نتيجه از اجراي كامل همه taskها اطمينان حاصل كنيد:
Job1 = dfevalasync(@myfun, 2, {a b c d}, {e f g h}, {w x y z});
و بعد:
waitForState(Job1,'finished')
data = getAllOutputArguments(Job1)