matlabによる制約最適化-並列計算
以前に作成した制約最適化コードは18のテスト問題で完了する必要があり、ランダム性の影響で複数回のテスト問題が必要で、時間がかかりすぎるため、matlabの並列計算の機能が必要です.
まずmatlabコマンドラインにhelp parpoolを入力します.
この関数の目的はクラスタ上にパラレルプールを作成することであり、以下に関数の使い方を示す.
parpoolのパラメータprofilename、poolsize、clusterはオプションで、値を指定しない場合はデフォルト設定を使用してパラレルプールを起動します.profilenameは指定したプロファイルからプールを構築し、poolsizeはプールの数を指定します.最大数はカーネル数に関係し、clusterは指定したクラスタからプールを構築します.
parpool('local',func)を使用して、ローカルプロファイルからfuncサイズのパラレルプールを構築します.
parpoolのヘルプ記述では、パラレル言語関数にはparforとspmdがあり、parfor関数はparallel forの略であり、matlabでパラレルループを行うために使用される.spmd関数はSingle Program/Multiple Dataの略であり,単一プログラムマルチタスク並列である.従って,本稿ではspmd関数を次の計算として用いる.
matlabコマンドラインにhelp spmdを入力します.
この関数の目的はパラレルプールのworkerパラレル実行コードであることがわかり、以下に関数の使い方を示す.
spmdのパラメータn、mはオプションで、デフォルトではパラレルプール内のすべてのworkerが使用され、使用可能なプールがない場合はmatlabがプールを作成し、すべてのworkerが使用されます.spmd(n)のパラメータnは、計算するmatlab workerの正確な数を指定するために使用され、spmd(m,n)のパラメータm,nはworker個数の範囲を表す.
spmd文のstatementsでは、各workerにlabindexの一意の値があり、numlabsはブロックを並列に実行するworkerの総数を表します.
私は18のテスト問題に対して繰り返し試験を行うので、関数spmd(func)を使用して、パラメータlabindexを問題番号として並列に実行することができます.
新しいpara_を作成func.mのスクリプトファイルは、最初は2つの関数でテストするつもりで、次のコードを入力します.
matlabは、SRSeDEag(line 1)を誤って使用し、透明度が例外的であるというエラーメッセージを示しています.エラーが検出されたら、スクリプトファイルSRSeDEag.mは関数に変更され、クラスタ内の最適値を返します.
その後para_を変更func.mスクリプトファイルテスト、matlabは再びエラー情報を報告します:
上記のコードを追加すると、プログラムテストに合格します.para_func.mスクリプトは最終的に:
1.spmd関数の戻りタイプはcompositeであり、Best{problem}でアクセスする.
2.デフォルトのlocalパラレルプールのサイズを変更します.ホームページ->環境->Parallel->Manage Cluster Profiles->local(default)->Edit->Properties->Number of workers to start on your local machine、18に変更します.
一、parpool関数
まずmatlabコマンドラインにhelp parpoolを入力します.
>> help parpool
parpool - Create parallel pool on cluster
This MATLAB function enables the full functionality of the parallel language
features (parfor and spmd) in MATLAB by creating a special job on a pool of
workers, and connecting the MATLAB client to the parallel pool.
parpool
parpool(poolsize)
parpool(profilename)
parpool(profilename,poolsize)
parpool(cluster)
parpool(cluster,poolsize)
parpool(___,Name,Value)
poolobj = parpool(___)
この関数の目的はクラスタ上にパラレルプールを作成することであり、以下に関数の使い方を示す.
parpoolのパラメータprofilename、poolsize、clusterはオプションで、値を指定しない場合はデフォルト設定を使用してパラレルプールを起動します.profilenameは指定したプロファイルからプールを構築し、poolsizeはプールの数を指定します.最大数はカーネル数に関係し、clusterは指定したクラスタからプールを構築します.
parpool('local',func)を使用して、ローカルプロファイルからfuncサイズのパラレルプールを構築します.
parpoolのヘルプ記述では、パラレル言語関数にはparforとspmdがあり、parfor関数はparallel forの略であり、matlabでパラレルループを行うために使用される.spmd関数はSingle Program/Multiple Dataの略であり,単一プログラムマルチタスク並列である.従って,本稿ではspmd関数を次の計算として用いる.
二、spmd関数
matlabコマンドラインにhelp spmdを入力します.
>> help spmd
spmd - Execute code in parallel on workers of parallel pool
This MATLAB function defines an spmd statement on a single line.
spmd, statements, end
spmd(n), statements, end
spmd(m,n), statements, end
この関数の目的はパラレルプールのworkerパラレル実行コードであることがわかり、以下に関数の使い方を示す.
spmdのパラメータn、mはオプションで、デフォルトではパラレルプール内のすべてのworkerが使用され、使用可能なプールがない場合はmatlabがプールを作成し、すべてのworkerが使用されます.spmd(n)のパラメータnは、計算するmatlab workerの正確な数を指定するために使用され、spmd(m,n)のパラメータm,nはworker個数の範囲を表す.
spmd文のstatementsでは、各workerにlabindexの一意の値があり、numlabsはブロックを並列に実行するworkerの総数を表します.
私は18のテスト問題に対して繰り返し試験を行うので、関数spmd(func)を使用して、パラメータlabindexを問題番号として並列に実行することができます.
三、関数スクリプト
新しいpara_を作成func.mのスクリプトファイルは、最初は2つの関数でテストするつもりで、次のコードを入力します.
func = 2;
parpool('local', func);
spmd(func)
problem = labindex;
SRSeDEag
end
matlabは、SRSeDEag(line 1)を誤って使用し、透明度が例外的であるというエラーメッセージを示しています.エラーが検出されたら、スクリプトファイルSRSeDEag.mは関数に変更され、クラスタ内の最適値を返します.
function [Best] = SRSeDEag(Problem)
その後para_を変更func.mスクリプトファイルテスト、matlabは再びエラー情報を報告します:
parpool (line 104)
Found an interactive session. You cannot have multiple interactive sessions open simultaneously. To terminate the existing session, use
'delete(gcp('nocreate'))'.
上記のコードを追加すると、プログラムテストに合格します.para_func.mスクリプトは最終的に:
delete(gcp('nocreate'));
func = 18;
parpool('local', func);
spmd(func)
problem = labindex;
Best = SRSeDEag(problem);
end
四、補充
1.spmd関数の戻りタイプはcompositeであり、Best{problem}でアクセスする.
2.デフォルトのlocalパラレルプールのサイズを変更します.ホームページ->環境->Parallel->Manage Cluster Profiles->local(default)->Edit->Properties->Number of workers to start on your local machine、18に変更します.