Main Content

メモリ ボトルネック解析

データの配置

条件

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 の動的な呼び出しのサポートが現在ないため、可変次元行列から適切なカーネルが作成されることはありません。

スタック メモリの使用量

推奨

カーネル内で大きなスタック メモリを使用すると、生成されたコードのパフォーマンスが低下する場合があります。このような条件下では、異なる方法でアルゴリズムを書き換えるか、小さい計算に分割してスタック メモリの使用量を削減し、パフォーマンスを向上させることを検討します。

関連するトピック