Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

parallel.pool.Constant

データまたは関数ハンドルから定数をビルドおよび使用する

    説明

    Constant オブジェクトを使用して、現在の MATLAB® セッションから並列プール内のワーカーに何度もデータが不必要にコピーされないようにします。クライアントで Constant オブジェクトを 1 回ビルドし、その定数をワーカーに 1 回転送します。複数の parfor ループ、spmd ブロック、または parfeval の呼び出しで Constant にアクセスします。Constant オブジェクトでアクセスする値は定数です。Constant オブジェクトを使用する並列コードは、Parallel Computing Toolbox™ を保有していない MATLAB ユーザーと共有できます。詳細については、parallel.pool.Constant を参照してください。

    作成

    parallel.pool.Constant を使用して、配列、関数ハンドル、または Composite オブジェクトから Constant オブジェクトを作成します。Value プロパティを使用して、基となるデータにアクセスします。

    説明

    C = parallel.pool.Constant(X) は配列 X を各ワーカーにコピーし、Constant オブジェクトを返します。

    各ワーカーは Value プロパティを使用して並列言語構成 (parforspmdparfeval) 内の配列 X にアクセスしてデータを読み取ることができます。

    C = parallel.pool.Constant(FH) は、各ワーカーの関数ハンドル FH を評価して、結果を Constant オブジェクト C に保存します。Value プロパティを使用することで、1 つの出力を使用して FH() を実行した結果にアクセスします。

    この構文を使用して、ファイル ハンドルやデータベース接続などの任意のハンドル型リソースを並列プール上で作成して使用します。各ワーカーで関数を評価してワーカーを設定してから計算を行う場合は、代わりに parfevalOnAll を使用します。

    C = parallel.pool.Constant(FH,cleanupFH) は、C が消去されたときに各ワーカーで cleanupFH(C.Value) を評価します。

    C = parallel.pool.Constant(COMP) は、各ワーカーで Constant オブジェクト CComposite オブジェクト COMP の項目の値を保存します。

    この構文を使用するのは、データが大きすぎてクライアントには適さない場合や、ワーカーのみがアクセスできるファイルからデータを読み込む場合など、ワーカー上でのみデータを作成する場合です。Value プロパティを使用して値にアクセスします。

    入力引数

    すべて展開する

    入力データ。保存および読み込みが可能な任意の MATLAB 変数として指定します。

    ビルド関数の関数ハンドル。関数ハンドルとして指定します。

    MATLAB はビルド関数を評価して、Constant オブジェクトの Value プロパティを取得します。この関数は入力引数を受け取らず、1 つの出力引数を返す必要があります。

    • MATLAB セッションまたは並列プール ワーカーではじめて Value プロパティを読み取ると、MATLAB は Value プロパティとしてその環境で fcn() を実行した結果を保存します。

    • この関数は MATLAB セッションまたは並列プール ワーカーで 1 回だけ実行されます。初回後に Value プロパティを読み取ると、保存された結果を読み取ります。

    • 別の並列プール ワーカーで Value プロパティを読み取ると、MATLAB はそのワーカーで fcn() を実行した結果を返します。

    例: @() fopen(tempname(pwd),'wt')

    クリーンアップ関数の関数ハンドル。関数ハンドルとして指定します。関数は、1 つの入力引数 (Constant オブジェクトの Value プロパティ) を受け入れなければなりません。

    MATLAB は、C が消去されたときにクリーンアップ関数を実行します。Constant オブジェクト C は、以下を行ったときに消去されます。

    • 関数で C を作成し、その関数から C を返さなかった。

    • Constant オブジェクトをワークスペースから消去した。

    例: @fclose

    Constant オブジェクトをビルドするための Composite オブジェクト。Composite オブジェクトとして指定します。

    COMP オブジェクトには各ワーカー上で定義された値が含まれている必要があり、含まれていない場合はエラーを受け取ります。

    例: spmd COMP = rand(3); end; C

    プロパティ

    すべて展開する

    基となるデータまたはハンドル型リソースの独立コピー。保存および読み込みが可能な任意の MATLAB 変数またはハンドル変数として指定します。

    ConstantValue プロパティを使用して、基となるデータまたはハンドル変数にアクセスします。

    すべて折りたたむ

    クライアントで配列から数値の Constant を作成し、同じプールの複数の parfor ループでそれを使用します。

    クライアント上に何らかの大規模データを作成し、次に Constant オブジェクト C をビルドして、データを一度だけプールに転送します。

    data = rand(1000);
    C = parallel.pool.Constant(data);

    データにアクセスする複数の parfor ループを実行します。効率化のために、結果配列を事前に割り当てます。

    x = eye(5);
    for ii = 1:5
        parfor jj = 1:5
            x(ii,jj) = C.Value(ii,jj);
        end
    end
    x
    x = 5×5
    
        0.0016    0.5273    0.3794    0.9148    0.2620
        0.1965    0.8118    0.7953    0.5239    0.4186
        0.3482    0.5745    0.6334    0.1987    0.5588
        0.2405    0.6587    0.4238    0.0736    0.6463
        0.8566    0.5241    0.0332    0.7331    0.9080
    
    

    関数ハンドルとクリーンアップ関数を使用して Constant オブジェクトを作成します。

    parallel.pool.Constant およびtempnameを使用して、各ワーカー上に一時ファイルを作成します。関数fclosecleanup 関数ハンドルとして渡すと、C が消去されたときにファイルが自動的に閉じられます。

    C = parallel.pool.Constant(@() fopen(tempname(pwd),'wt'),@fclose);

    一時ファイル名を表示します。

    spmd
       disp(fopen(C.Value));
    end
    Worker 1: 
      C:\myTemporaryFiles\tpb2d60042_d684_4705_b084_63496d07b936
    Worker 2: 
      C:\myTemporaryFiles\tpc6bef84f_bebe_44fc_acb2_ddd2fcba5026
    Worker 3: 
      C:\myTemporaryFiles\tpf6775778_b06a_46ba_b502_27e2c253c66f
    Worker 4: 
      C:\myTemporaryFiles\tp4dc6e57a_6b65_437a_8eb7_82877403eee3
    Worker 5: 
      C:\myTemporaryFiles\tpd0e279ac_a141_49f0_a0b6_90c4cad137a4
    Worker 6: 
      C:\myTemporaryFiles\tpf02acaad_60a5_441a_b1a1_46e4c66f33a1
    

    各ワーカー上のファイルにデータを書き込みます。

    parfor idx = 1:1000
        fprintf(C.Value,'Iteration: %d\n',idx);
    end

    C を消去して一時ファイルを閉じます。

    clear C;   

    spmd ブロック内でプールのワーカー上の Composite オブジェクトから Constant オブジェクトをビルドします。

    spmd ブロックで、spmdBroadcastを使用して Composite オブジェクトを作成し、すべてのワーカーにいくつかの大規模データを送信します。

    spmd
      if spmdIndex == 1
        x = spmdBroadcast(1,rand(5000));
      else
        x = spmdBroadcast(1);
      end
    end
    Starting parallel pool (parpool) using the 'Processes' profile ...
    Connected to parallel pool with 6 workers.
    

    Composite オブジェクトを使用して Constant オブジェクトをビルドし、parfor ループでそのオブジェクトを使用します。

    xc = parallel.pool.Constant(x);
    parfor idx = 1:10
      s(idx) = sum(xc.Value(:,idx));
    end
    s
    s = 1×10
    103 ×
    
        2.5110    2.5256    2.5060    2.4909    2.5078    2.5187    2.4791    2.4842    2.4926    2.4903
    
    

    ヒント

    MATLAB クライアント セッションで関数 parallel.pool.Constant を使用する必要があります。

    Constant オブジェクトは、既に実行中の並列プール、または後続の並列プールと共に使用できます。

    バージョン履歴

    R2015b で導入

    すべて展開する