Main Content

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

生成コードの正確性の検証

GPU Coder™ には、コードの生成後、ソース コードを検証して生成コードの正確性をテストする複数のオプションが用意されています。

  • コード生成レポートは、生成された CUDA® C++ ソース ファイル、生成されたデータ型およびその他のコードの洞察を検証する対話型のインターフェイスを提供します。詳細については、コード生成レポートを参照してください。

  • GPU Coder アプリで、生成された MEX 関数を検証します。

  • コマンド ラインで、生成された MEX 関数を検証します。

  • GPU Coder Support Package for NVIDIA® GPUs では、プロセッサインザループ (PIL) 実行を使用して MATLAB® 関数から生成した CUDA コードの数値的動作をチェックできます。詳細は、Processor-In-The-Loop Execution from Command Line (GPU Coder Support Package for NVIDIA GPUs)Processor-In-The-Loop Execution with the GPU Coder App (GPU Coder Support Package for NVIDIA GPUs)を参照してください。

  • Embedded Coder® がある場合、ソフトウェアインザループ (SIL) 実行を使用して、生成された CUDA C++ コードの数値的な動作を検証できます。

GPU Coder アプリでの MEX 関数の検証

GPU Coder アプリでは、MEX 関数を生成した後に、その関数に元の MATLAB エントリポイント関数と同じ機能があることを検証できます。テスト対象の関数用にテスト ベクトルを生成するテスト ファイルを指定してから、元の MATLAB エントリポイント関数を呼び出します。テスト ファイルには MATLAB 関数またはスクリプトを指定できますが、元のエントリポイント関数と同じフォルダーに配置しなければなりません。

  • GPU Coder アプリの [コード生成] ページで [コードの検証] をクリックします。

  • テスト ファイルを入力または選択します。たとえば、myfunction_test のようにします。

  • 元の MATLAB 関数の呼び出しを MEX 関数の呼び出しと置き換えずにテスト ファイルを実行するには、[次を使用して実行] オプションに対して [MATLAB コード] を選択します。[生成されたコードの実行] をクリックします。

  • 元の MATLAB 関数の呼び出しを MEX 関数の呼び出しと置き換えてテスト ファイルを実行するには、[次を使用して実行] オプションに対して [生成コード] を選択します。[生成されたコードの実行] をクリックします。

  • 元の MATLAB 関数を実行した結果と、生成された CUDA MEX 関数を実行した結果を比較します。

コマンド ラインでの MEX 関数の検証

関数 coder.runTest を使用して、生成された CUDA MEX ファイルをコマンド ラインで検証できます。関数 coder.runTest は、元の MATLAB 関数の呼び出しと MEX 関数の呼び出しを置き換えて、テスト ファイルを実行します。たとえば、myfunction_test テスト ファイルを使用して関数 myfunction をテストするには、MATLAB コマンド ウィンドウに次のコードを入力します。

coder.runTest('myfunction_test','myfunction')

結果を、元の MATLAB 関数を実行した結果と比較します。実行中にエラーが発生した場合、デバッグ用に呼び出しスタックの情報が提供されます。または、-test オプションを指定して codegen を使用できます。

codegen myfunction -test'myfunction_test'

テスト ファイルには、MATLAB 関数、スクリプト、またはクラス ベースのユニット テストを指定できます。

ソフトウェアインザループによるコード検証

GPU Coder は、ソフトウェアインザループ (SIL) 実行をサポートしています。これにより、ソース コードとコンパイルされたオブジェクト コードを検証できます。MATLAB SIL インターフェイスを介した SIL の実行中、ソフトウェアは開発用コンピューター上でライブラリ コードをコンパイルし、指定したテスト ベクトルを使用してライブラリ コードを実行します。MATLAB 関数用に開発したテスト ベクトルを再利用して、ライブラリ コードの数値的な動作を検証できます。

メモ

  • Microsoft®Windows® システムでは、Windows ファイアウォールによって SIL 実行がブロックされる可能性があります。アクセスが許可されるように Windows ファイアウォールの設定を変更してください。

  • Windows プラットフォーム上での SIL では、コード生成言語を C ではなく C++ に設定することが推奨されます。

  • SIL 実行を使用する場合、GPU Coder 設定の Benchmarking オプションが false になっていることを確認してください。ベンチマークを使用して SIL を実行するとコンパイル エラーになります。

GPU Coder アプリによる SIL 実行

ソフトウェアインザループ (SIL) 実行は [スタティック ライブラリ] および [ダイナミック ライブラリ] 出力タイプでのみサポートされます。MEX 関数を生成した場合、[ビルド タイプ][スタティック ライブラリ] または [ダイナミック ライブラリ] を使用するようにプロジェクト設定を変更し、[コード生成] を再度実行しなければなりません。

  1. GPU Coder アプリを開くには、MATLAB ツールストリップの [アプリ] タブにある [コード生成] で、アプリ アイコンをクリックします。

  2. プロジェクトを開くには、 をクリックし、[既存のプロジェクトを開く] をクリックします。プロジェクト myproject.prj を選択します。[コード生成] ページで、[生成] 矢印 をクリックします。

  3. [生成] ダイアログ ボックスで、以下を行います。

    • [ビルド タイプ][スタティック ライブラリ] または [ダイナミック ライブラリ] に設定します。

    • [コード生成のみ] チェック ボックスをオフにします。

    • 他の設定は既定値をそのまま使用できます。

  4. CUDA C++ コードを生成するには、[生成] をクリックします。[コードの検証] をクリックします。

  5. コマンド フィールドで、元の MATLAB 関数 (例: myfunction) を呼び出すテスト ファイル (例: myfunction_test.m) を指定します。

  6. SIL 実行を開始するには、[生成されたコードの実行] をクリックします。GPU Coder アプリは以下を行います。

    • codegen\lib\myfunction にスタンドアロン ライブラリを生成します。

    • codegen\lib\myfunction\sil に SIL インターフェイス コードを生成します。

    • テスト ファイルを実行し、MATLAB 関数の呼び出しとライブラリ内の生成コードの呼び出しを置き換えます。

    • SIL 実行からのメッセージを [テスト出力] タブに表示します。

  7. SIL 実行の結果と元の MATLAB 関数の結果が一致していることを確認します。

  8. SIL 実行プロセスを終了するには、[SIL 検証を停止] をクリックします。または、[テスト出力] タブで、[実行を終了するには] の後ろにあるリンクをクリックします。

コマンド ラインからの SIL 実行

コマンド ラインから SIL 実行を設定および開始するには、ライブラリ コード生成用の GPU Coder 構成オブジェクトを作成し、config_obj.VerificationMode = 'SIL' を有効にします。次に、関数 codegen を使用してライブラリ コードと SIL インターフェイスを生成し、関数 coder.runTest を使用して元の MATLAB 関数用のテスト ファイルを実行します。以下は、SIL 実行を行うための一連のコマンドを自動化するビルド スクリプトです。

%% Create configuration object for static library.
config = coder.gpuConfig('lib');
config.GenerateReport = true;
config.VerificationMode = 'SIL';

%% Define argument types for entry-point 'mandelbrot_count'.
ARGS = cell(1,1);
ARGS{1} = cell(3,1);
ARGS{1}{1} = coder.typeof(0);
ARGS{1}{2} = coder.typeof(0,[1000 1000]);
ARGS{1}{3} = coder.typeof(0,[1000 1000]);

%% Invoke GPU Coder.
codegen -config config myfunction -args ARGS{1}

%% Run the test file with the sil interface
coder.runTest('myfunction_test', ['myfunction_sil.' mexext]);

%% Terminate SIL execution
clear myfunction_sil;

CPU と GPU の数値の差

CPU と GPU ではアーキテクチャが異なるため、数値検証が常に一致するとは限りません。このシナリオは、single データ型を MATLAB コードで使用し、これらの single データ型の値に対して累積演算を実行する場合に、特に当てはまります。ただし、マンデルブロの例のように、double データ型が数値誤差の原因になる場合もあります。この不一致が発生する 1 つの原因は、GPU の浮動小数点単位では融合浮動小数点積和演算 (FMAD) 命令が使用される一方で、CPU ではこれらの命令が使用されないためです。また、CUDA コンパイラにより、計算結果の精度に影響するこれらの命令レベルの最適化が既定で実行されることも重要です。たとえば、CUDA コンパイラは、浮動小数点の乗算命令と加算命令を融合して単一の命令に変えます。この浮動小数点積和演算 (FMAD) 操作は、2 つの単一の命令に比べて 2 倍高速に実行されますが、数値の精度が失われる結果になります。組み込み関数とコンパイラ フラグを使用することで、これらの最適化をより厳しく制御できます。コンパイラ フラグを使用するにはGPU Coder 構成プロパティを、内部パラメーターを使用するにはレガシ コードの統合をそれぞれ参照してください。