Main Content

NVIDIA ハードウェアでの実行可能ファイルのビルドと実行

GPU Coder™ および MATLAB® Coder™ Support Package for NVIDIA® Jetson™ and NVIDIA DRIVE® Platforms を使用すると、NVIDIA DRIVE/Jetson ハードウェア プラットフォームをターゲットにすることができます。ハードウェア プラットフォームに接続した後に、基本的な操作を行ったり、MATLAB エントリポイント関数から CUDA® 実行可能ファイルを生成したり、実行可能ファイルをハードウェア上で実行したりできます。

メモ

R2021a 以降、GPU Coder Support Package for NVIDIA GPUs の名称は、MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms になりました。R2021a でこのサポート パッケージを使用するには、MATLAB Coder 製品がインストールされていなければなりません。

学習目標

このチュートリアルでは、次の方法を学びます。

  • kernelfun プラグマを使用した CUDA コード生成のための MATLAB コードの準備。

  • NVIDIA ターゲット ボードへの接続。

  • ターゲット ボードでの CUDA 実行可能ファイルの生成および展開。

  • ボードでの実行可能ファイルの実行と結果の検証。

チュートリアルの前提条件

ターゲット ボード要件

  • NVIDIA DRIVE PX2 または Jetson 組み込みプラットフォーム。

  • ターゲット ボードとホスト PC を接続するイーサネット クロスオーバー ケーブル (ターゲット ボードをローカル ネットワークに接続できない場合)。

  • ボードにインストールされている NVIDIA CUDA Toolkit。

  • コンパイラおよびライブラリ用のターゲット上の環境変数。サポートされているコンパイラおよびライブラリのバージョンおよびその設定の詳細については、Install and Setup Prerequisites for NVIDIA Boardsを参照してください。

開発用ホスト要件

  • ホスト上の NVIDIA CUDA Toolkit。

  • コンパイラおよびライブラリ用のホスト上の環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細については、サードパーティ ハードウェアを参照してください。環境変数の設定は、環境変数を参照してください。

例:ベクトルの加算

このチュートリアルでは、単純なベクトル加算例を使用して NVIDIA GPU でのビルドと展開のワークフローを示します。コード生成の "エントリポイント" として機能する MATLAB 関数 myAdd.m を作成します。または、このチュートリアルのMATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms 入門の例でファイルを使用します。この関数の CUDA コードを作成する最も簡単な方法は、coder.gpu.kernelfun プラグマを関数に配置することです。GPU Coder は kernelfun プラグマを検出すると、この関数内の計算を並列化し、その計算を GPU にマッピングしようとします。

function out = myAdd(inp1,inp2) %#codegen
coder.gpu.kernelfun();
out = inp1 + inp2;
end

ライブ ハードウェア接続オブジェクトの作成

サポート パッケージ ソフトウェアは、生成された CUDA コードを DRIVE プラットフォームまたは Jetson プラットフォームでビルドして実行している間、TCP/IP 経由の SSH 接続を使用してコマンドを実行します。ターゲット プラットフォームをホスト コンピューターと同じネットワークに接続するか、イーサネット クロス ケーブルを使用してボードをホスト コンピューターに直接接続します。ボードの設定および構成方法については NVIDIA のドキュメンテーションを参照してください。

NVIDIA ハードウェアと通信するには、関数 jetson または drive を使用してライブ ハードウェア接続オブジェクトを作成しなければなりません。関数を使用してライブ ハードウェア接続オブジェクトを作成するには、ターゲット ボードのホスト名または IP アドレス、ユーザー名、およびパスワードを提供します。たとえば、次のようにして Jetson ハードウェアのライブ オブジェクトを作成します。

hwobj = jetson('jetson-board-name','ubuntu','ubuntu');

ハードウェア、コンパイラ ツール、ライブラリ、IO サーバーのインストールをチェックし、ターゲットの周辺装置情報を収集します。この情報はコマンド ウィンドウに表示されます。

Checking for CUDA availability on the Target...
Checking for NVCC in the target system path...
Checking for CUDNN library availability on the Target...
Checking for TensorRT library availability on the Target...
Checking for Prerequisite libraries is now complete.
Gathering hardware details...
Checking for third-party library availability on the Target...
Gathering hardware details is complete.
 Board name         : NVIDIA Jetson TX2
 CUDA Version       : 10.0
 cuDNN Version      : 7.6
 TensorRT Version   : 6.0
 GStreamer Version  : 1.14.5
 V4L2 Version       : 1.14.2-1
 SDL Version        : 1.2
 OpenCV Version     : 4.1.1
 Available Webcams  : UVC Camera (046d:0809)
 Available GPUs     : NVIDIA Tegra X2

または、次のようにして DRIVE ハードウェアのライブ オブジェクトを作成します。

hwobj = drive('drive-board-name','nvidia','nvidia');

メモ

接続に失敗した場合、MATLAB コマンド ウィンドウで診断エラー メッセージが報告されます。接続が失敗した場合に最も可能性が高い原因は、IP アドレスまたはホスト名が誤っていることです。

GPU Coder を使用した CUDA 実行可能ファイルの生成

NVIDIA のターゲットに展開できる CUDA 実行可能ファイルを生成するには、カスタムのメイン ファイル (main.cu) とヘッダー ファイル (main.h) を作成します。メイン ファイルは、MATLAB エントリポイント関数用に生成されたコードを呼び出します。メイン ファイルは最初の 100 個の自然数が含まれるベクトルをエントリポイント関数に渡して、その結果をバイナリ ファイル (myAdd.bin) に書き込みます。

 main.cu

 main.h

実行可能ファイルを生成するために、GPU コード構成オブジェクトを作成します。関数 coder.hardware を使用して DRIVE または Jetson プラットフォーム用の構成オブジェクトを作成し、それをコード構成オブジェクト cfgHardware プロパティに割り当てます。BuildDir プロパティを使用してターゲットでリモート ビルド プロセスを実行するフォルダーを指定します。指定したビルド フォルダーがターゲットに存在しない場合は、指定した名前でフォルダーが作成されます。値が cfg.Hardware.BuildDir に代入されない場合、リモート ビルド プロセスは最後に指定されたビルド フォルダーで行われます。格納されているビルド フォルダー値がない場合、ビルド プロセスはホーム フォルダーで行われます。

cfg = coder.gpuConfig('exe');
cfg.Hardware = coder.hardware('NVIDIA Jetson');
cfg.Hardware.BuildDir = '~/remoteBuildDir';
cfg.CustomSource  = fullfile('main.cu');

CUDA コードを生成するには、codegen コマンドを使用して、入力のサイズと myAdd エントリポイント関数と共に GPU コード構成オブジェクトを渡します。ホストでコード生成が行われた後、生成されたファイルがターゲットにコピーされてビルドされます。

codegen('-config ',cfg,'myAdd','-args',{1:100,1:100});

実行可能ファイルの実行と結果の検証

ターゲット ハードウェアで実行可能ファイルを実行するには、ハードウェア オブジェクトの runApplication() メソッドを使用します。MATLAB コマンド ウィンドウに、次のように入力します。

pid = runApplication(hwobj,'myAdd');
### Launching the executable on the target...
Executable launched successfully with process ID 26432.
Displaying the simple runtime log for the executable...

出力ビン ファイル myAdd.bin をホストの MATLAB 環境にコピーして、計算結果を MATLAB からの結果と比較します。

outputFile = [hwobj.workspaceDir '/myAdd.bin']
getFile(hwobj,outputFile);

% Simulation result from the MATLAB.
simOut = myAdd(0:99,0:99);

% Read the copied result binary file from target in MATLAB.
fId  = fopen('myAdd.bin','r');
tOut = fread(fId,'double');
diff = simOut - tOut';
fprintf('Maximum deviation : %f\n', max(diff(:)));
Maximum deviation between MATLAB Simulation output and GPU coder output on Target is: 0.000000

参考

オブジェクト

関連するトピック