Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

生成された CUDA コードおよび MATLAB ソース コード間でのトレース

この例では、MATLAB® ソース コードと生成された CUDA® コード間でトレース (セクションの強調表示) を行う方法を説明します。ソース コードと生成コード間でのトレースは以下を行うのに役立ちます。

  • コード ジェネレーターによる GPU カーネルへのアルゴリズムのマッピング方法を理解する。

  • 生成コードの問題をデバッグする。

  • 生成コードの品質を評価する。

次のいずれかの方法を使用してトレースできます。

  • MATLAB ソース コードをコメントとして含むコードを生成するよう GPU Coder™ を設定する。コメントでは、ソース コードの各行の直前にトレーサビリティ タグが置かれます。トレーサビリティ タグは、ソース コードの場所に関する詳細を提供します。Embedded Coder® をご利用の場合、コード生成レポート内のトレーサビリティ タグは、対応する MATLAB ソース コードへのリンクになります。

  • Embedded Coder では、双方向のトレーサビリティを含むコード生成レポートが出力されます。レポート内の双方向のトレースを使用すると、MATLAB ソース コードと生成された C/C++ コードとのマッピングを可視化できます。Interactively Trace Between MATLAB Code and Generated C/C++ Code (Embedded Coder)を参照してください。

トレーサビリティ タグの生成

MATLAB ソース コードの作成

トレーサビリティ タグを説明するために、この例では、CPU で実行される標準の MATLAB コマンドを使ったマンデルブロ集合の実装を使用します。この実装は、電子書籍『Experiments with MATLAB』(Cleve Moler 著) で提供されているコードに基づきます。

マンデルブロ集合とは、下記の方程式で定義された軌跡が k→∞ のときに有限の範囲内にとどまる値 z0 で構成された複素平面の領域です。

zk+1=zk2+z0,k=0,1,

次のコード行を使用して mandelbrot_count.m という MATLAB 関数を作成します。このコードは、マンデルブロ集合のベクトル化済みの MATLAB 実装です。これは、グリッドのすべての点 (xGrid,yGrid) について、方程式で定義された軌跡の原点からの距離が 2 になる反復インデックス count を計算します。次に、count の自然対数を返します。これはマンデルブロ集合の色分けされたプロットを生成するために使用されます。

function count = mandelbrot_count(maxIterations,xGrid,yGrid)
% Add kernelfun pragma to trigger kernel creation
coder.gpu.kernelfun;
% mandelbrot computation

z0 = xGrid + 1i*yGrid;
count = ones(size(z0));

z = z0;
for n = 0:maxIterations
    z = z.*z + z0;
    inside = abs(z)<=2;
    count = count + inside;
end
count = log(count);

テスト ベクトルの作成

次のコード行を使用して、エントリポイント関数のテスト ベクトルを作成します。このスクリプトは、xlimylim で指定した範囲間に実数部 (x) と虚数部 (y) の 1000 x 1000 のグリッドを生成します。これらの入力を使用して、エントリポイント関数 mandelbrot_count を検証し、結果のマンデルブロ集合をプロットできます。

maxIterations = 500;
gridSize = 1000;
xlim = [-0.748766713922161,-0.748766707771757];
ylim = [0.123640844894862,0.123640851045266];

x = linspace(xlim(1),xlim(2),gridSize);
y = linspace(ylim(1),ylim(2),gridSize);
[xGrid,yGrid] = meshgrid(x,y);

トレーサビリティ タグの生成

生成コード内にトレーサビリティ タグを出力するには、コメントとしての MATLAB ソース コードの生成を有効にします。

  • GPU Coder アプリで、[コメントとして MATLAB ソース コードを含める][はい] に設定します。

  • コード生成構成オブジェクトで、coder.gpuConfig オブジェクトを作成し、MATLABSourceComments プロパティを true に設定します。

    cfg = coder.gpuConfig('dll','ecoder',true);
    cfg.GenerateReport = true;
    cfg.MATLABSourceComments = true;
    cfg.GpuConfig.CompilerFlags = '--fmad=false';
    codegen -config cfg -args {maxIterations,xGrid,yGrid} mandelbrot_count

    メモ

    --fmad=false フラグは、nvcc に渡すと、浮動小数点積和演算 (FMAD) 最適化を無効にするようにこのコンパイラに指示します。このオプションは、CPU と GPU のアーキテクチャの違いが原因で、生成コード上の数値の不一致を防ぐために設定します。詳細については、CPU と GPU の数値の差を参照してください。

レポートへのアクセス

コード生成レポートを開くには、[レポートの表示] をクリックします。

コード生成レポートには report.mldatx という名前が付けられます。これは、コード生成出力フォルダーの html サブフォルダー内に配置されます。MATLAB R2018a 以降をご利用の場合は、report.mldatx ファイルをダブルクリックして開くことができます。

[MATLAB ソース] ペインで、mandelbrot_count.m を選択します。[コード] ペインに MATLAB ソース コードが表示されます。

関数 mandelbrot_count の隣にある緑色の [GPU] マーカーは、生成コードに CPU および GPU の両方のセクションがあることを示します。緑色の垂直バーは GPU にマッピングされるコード行を示します。変数または式の型に関する情報、および対応する GPU カーネル関数の名前を表示するには、変数または式の上でポインターを止めます。強調表示されたコードをクリックして選択すると、コードの色が青になり、そのセクションからポインターを遠ざけても情報を確認できます。Esc キーを押すか、別のコードを選択するまでそのコードは選択されたままです。

エントリ ポイント関数 mandelbrot_count.m 用に生成された CUDA コードを表示するには、[生成コード] ペインから mandelbrot_count.cu を選択します。

トレーサビリティ タグの形式

生成コードでは、コメント内の MATLAB ソース コードの直前にトレーサビリティ タグが表示されます。タグの形式は次のようになります。
<filename>:<line number>

たとえば、このコメントは、ソース ファイル mandelbrot_count.m5 行目にコード z0 = xGrid + 1i*yGrid; があることを示しています。

/* 'mandelbrot_count:5' z0 = xGrid + 1i*yGrid;

トレーサビリティ タグの制限事項

  • MATLAB ソース コードは、以下に対してコメントとして含めることはできません。

    • MathWorks® ツールボックスの関数

    • P コード

  • コメントの外観と位置は次のように異なる場合があります。

    • たとえば定数畳み込みなどにより実装コードが消去された場合でも、生成されたコード内にコメントが挿入されることがあります。

    • 関数またはコード ブロック全体が消去された場合、生成されたコードからコメントが消去される可能性があります。

    • 最適化によっては、これらのコメントが生成されたコードから分離される場合があります。

    • 生成コード内にソース コードのコメントを含めることを選択しなかった場合でも、生成コードは MATLAB ソース コードからの法的に必要なコメントを含みます。

  • 複数の出力がある関数は強調表示されません。

  • coder.nullcopy など、関数 coder の呼び出しは強調表示されません。

  • cuDNN、cuBLAS、cuFFT などのライブラリの呼び出しにマッピングされるコードは強調表示されません。その結果、GPU に完全にマッピングされる関数に誤ってタグ付けされる可能性があります。

参考

| | |

関連するトピック