arrayfun
関数を GPU 上の配列内の各要素に適用する
説明
メモ
この関数の動作は MATLAB® 関数 arrayfun
と似ていますが、関数の評価が CPU ではなく GPU で行われる点で異なります。まだ GPU 上にない必要なデータは GPU メモリに移動されます。評価のために渡された MATLAB 関数がコンパイルされてから GPU で実行されます。すべての出力引数は gpuArray
オブジェクトとして返されます。関数 gather
を使用して gpuArray
データを取得できます。
は、関数 B
= arrayfun(FUN
,A
)FUN
を gpuArray
A
の各要素に適用します。次に arrayfun
は FUN
の出力を連結して gpuArray
B
の出力を生成します。B
は A
と同じサイズであり、B(i,j,...) = FUN(A(i,j,...))
です。入力引数 FUN
は、1 つの入力引数を受け入れ、スカラー値を返す MATLAB 関数の関数ハンドルです。FUN
は、A
の要素数と同じ回数呼び出されます。
arrayfun
での B
の要素の計算順序を指定したり、特定の順序で計算される要素に依存したりすることはできません。
例
入力引数
出力引数
ヒント
GPU で特定の関数を呼び出すために最初に
arrayfun
を呼び出す時点では、GPU 実行のための関数の設定に若干のオーバーヘッド時間が発生します。同じ関数を指定したその後のarrayfun
の呼び出しでは、処理速度が向上します。入力配列の大きさが 1 でない次元は他の入力配列の大きさが 1 でない次元と一致しなければなりません。つまり、対応する引数の次元
A1,...,An
はサイズが互いに等しいか、1 でなければなりません。入力配列の次元がシングルトン (1
と等価) である場合は常に、arrayfun
はシングルトン拡張を使用します。大きさが 1 の次元に沿って配列を実質的に複製し、その次元のサイズを最大の他の配列と一致させます。入力配列の 1 つの次元の大きさが 1 で、別の引数配列の対応する次元がゼロである場合、arrayfun
は実質的に大きさが 1 の次元を0
に減じます。出力配列
B
の各次元は、非ゼロ サイズの次元では入力配列のうち最大の配列と同じサイズに、それ以外ではゼロになります。次のコードは、サイズ1
の次元を、他の引数内の対応する次元のサイズと一致させるためにどのように増減しているかを示します。R1 = rand(2,5,4,"gpuArray"); R2 = rand(2,1,4,3,"gpuArray"); R3 = rand(1,5,4,3,"gpuArray"); R = arrayfun(@(x,y,z)(x+y.*z),R1,R2,R3); size(R)
2 5 4 3
R1 = rand(2,2,0,4,"gpuArray"); R2 = rand(2,1,1,4,"gpuArray"); R = arrayfun(@plus,R1,R2); size(R)
2 2 0 4
arrayfun
によりサポートされている演算は厳密に要素単位であり、各要素の各計算は他の要素と独立して実行されるため、一定の制約が適用されます。入出力配列の形状やサイズは変更できません。
rand
などの配列作成関数は、サイズ指定をサポートしていません。乱数の配列は、要素ごとに独立したストリームを有しています。
MATLAB の
arrayfun
と同様に、行列のべき乗、乗算および除算 (^
、*
、/
、\
) では要素単位の計算のみが実行されます。入出力配列 (
cat
、reshape
など) のサイズまたは形状を変更する演算はサポートされていません。読み取り専用のインデックス付け (
subsref
) と、入れ子関数の中から親 (外側) 関数ワークスペースの変数へのアクセスがサポートされています。GPU で関数を評価する前に、その関数内にある変数にインデックスを付けることができます。入れ子関数の中からこのような変数を代入したりそれをsubsasgn
インデックス化することは、サポートされません。サポートされている使用法の例は、GPU でのステンシル演算を参照してください。無名関数はその親関数のワークスペースにはアクセスできません。
サポートされている関数のオーバーロードは許可されません。
コードからスクリプトを呼び出すことはできません。
代入されていない計算結果を格納する
ans
変数はありません。必ずすべての計算結果を明示的に変数に代入します。サポートされていない言語機能として、永続変数またはグローバル変数、
parfor
、spmd
、try
およびcatch
が挙げられます。P コード ファイルに、
gpuArray
データがあるarrayfun
の呼び出しを含めることはできません。