gop

全ワーカーにわたるグローバルな演算

構文

res = gop(FUN,x)
res = gop(FUN,x,targetlab)

引数

FUN

全ワーカーで演算の行われる関数

x

関数 F の引数。すべてのワーカーで同じ変数となりますが、異なる値を設定できます。

res

リダクションの結果を格納する変数

targetlab

リダクションの結果が返されるラボこの値はワーカーの labindex によって返されます。

説明

res = gop(FUN,x) は、各ワーカーでの数量 x を持つ関数 FUN によるリダクションです。結果はすべてのワーカー上に複製されます。

FUN は、ユーザー記述の関数やユーザー定義の無名関数を含む任意の関数へのハンドルでもかまいません。同じ型の 2 つの引数を受け入れ、その同じ型の結果を 1 つ返すため、次の形式で繰り返して使用できます。

  FUN(FUN(x1,x2),FUN(x3,x4))

関数 FUN では、次のように結合法則が成り立ちます。

FUN(FUN(x1,x2),x3) = FUN(x1,FUN(x2,x3))

res = gop(FUN,x,targetlab) はリダクションを実行し、結果を targetlab で指定されたワーカー上の res のみに格納します。その他すべてのワーカーでは、res[ ] に設定されます。

この例は、全ワーカー間における x の値の合計と最大値の計算方法を示します。

p = parpool('local',4);
x = Composite(); 
x{1} = 3;
x{2} = 1;
x{3} = 4;
x{4} = 2;
spmd
    xsum = gop(@plus,x);
    xmax = gop(@max,x);
end
xsum{1}
10
xmax{1}
4

この例は、すべてのワーカーの x の列ベクトルを、行列に水平方向に連結する方法を示します。前の例で開かれた 4 個のワーカーからなる並列プールが使用されています。

x{1} = [3;30];
x{2} = [1;10];
x{3} = [4;40];
x{4} = [2;20];
spmd
    res = gop(@horzcat,x);
end
res{1}
     3     1     4     2
    30    10    40    20

この例では、無名関数を gop と共に使用し、間にスペースを入れて文字ベクトルを結合する方法を説明します。この例では、文字ベクトルは各ワーカーの labindex 値から作成されます。

afun = @(a,b)[a,' ',b]
spmd
    res = gop(afun,num2str(labindex));
end
res{1}
1 2 3 4

R2006a より前に導入