メモリ ボトルネック解析
データの配置
条件
MATLAB は列優先ですが、最適化された行優先の実装向けにアルゴリズムを実装する場合があります。生成コードでは、最速の次元の変更が最も内部のループでない場合、メモリが結合されません。多くの場合、入力行列を転置することで簡単にこの問題を修正できます。
操作
データの転置を試します。
小さなデータ サイズ
条件
問題やデータ サイズが小さすぎる場合、データを GPU に移動することによるオーバーヘッドによって (それが I/O 境界での移動のみだったとしても)、GPU で実行することによるパフォーマンスの向上が相殺される可能性があります。
操作
より大きなデータ サイズでアルゴリズムを試します。
過剰な cudaMemcpy
条件
coder.gpu.kernel
のみを使用している場合、ループの外側にあるものはすべて CPU に移されます。ほとんどのコードを GPU 上に維持するために、両方のプラグマを使用することが推奨されます。また、サポートされない関数や、GPU 上で実行できない関数またはステートメントがあると、生成される cudaMemcpys
が増える原因になります。
操作
coder.gpu.kernel
に加えて coder.gpu.kernelfun
を使用します。
定数入力
推奨
エントリポイント関数の特定の入力が定数である場合、coder.const
オブジェクトを使用してそれらをラップします。coder.const
オブジェクトは、コード生成時にこれらの変数が定数であることを示します。この関数を使用しないと、GPU Coder™ でこれらの入力が変数だと見なされるため、これらの変数を使ってサイズ指定した行列が可変次元行列として扱われます。GPU Coder では、カーネルの動的なサイズ設定や、関数 cudaMemcpy
の動的な呼び出しが現在サポートされていないため、可変次元行列から適切なカーネルが作成されることはありません。
スタック メモリの使用量
推奨
カーネル内で大きなスタック メモリを使用すると、生成されたコードのパフォーマンスが低下する場合があります。このような条件下では、異なる方法でアルゴリズムを書き換えるか、小さい計算に分割してスタック メモリの使用量を削減し、パフォーマンスを向上させることを検討します。