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