メインコンテンツ

MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms 入門

この例では、NVIDIA® の組み込みボードで MATLAB® Coder™ Support Package for NVIDIA Jetson™ and NVIDIA DRIVE® Platforms を使用する方法を示します。この例では、単純なベクトル加算アルゴリズムを使用して次のことを説明します。

  • MATLAB® 環境から組み込みボードへの接続。

  • MATLAB との間のファイル転送やボード上での Linux® シェル コマンドの実行など、基本的な操作の実行。

  • MATLAB 関数からの C++ 実行可能ファイルの生成、およびボード上の ARM® CPU での実行可能ファイルの実行。

  • MATLAB 関数からの CUDA® 実行可能ファイルの生成、およびボード上の NVIDIA GPU での実行可能ファイルの実行。

nvidiaHSPImage.jpg

前提条件

ターゲット ボード要件

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

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

  • ボードにインストールされている NVIDIA CUDA Toolkit およびライブラリ。

  • コンパイラおよびライブラリ用のターゲット上の環境変数。詳細については、Prerequisites for Generating Code for NVIDIA Boardsを参照してください。

開発用ホスト要件

NVIDIA ハードウェアへの接続

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

NVIDIA ハードウェアと通信するには、drive関数またはjetson関数を使用してライブ ハードウェア接続オブジェクトを作成します。ターゲット ボードに初めて接続するときは、ターゲット ボードのホスト名 (または IP アドレス)、ユーザー名、およびパスワードを提供しなければなりません。以降の接続では、アドレス、ユーザー名、パスワードを入力する必要はありません。ハードウェア オブジェクトは、直近で NVIDIA ボードに正常に接続されたときの設定を再利用します。

既定で、この例では、直近で NVIDIA Jetson ボードに正常に接続されたときの設定を再利用します。別のボードに接続するには、次のコード行の deviceAddressuserNamepasswordboardName を変更します。

deviceAddress = ''; 
userName = 'ubuntu';
password = 'ubuntu';
boardName = "jetson";

ハードウェア ライブ オブジェクトの作成時、サポート パッケージはハードウェアとソフトウェアのチェックを実行し、ターゲット ボードに MATLAB IO サーバーをインストールし、ターゲットに接続されている周辺デバイスの情報を収集します。この情報はコマンド ウィンドウに表示されます。接続に失敗した場合は、MATLAB コマンド ラインで診断エラー メッセージが報告されます。接続が失敗した場合に最も可能性が高い原因は、IP アドレスまたはホスト名が誤っていることです。

if (boardName == "jetson")
    if isempty(deviceAddress)
        hwobj = jetson();
    else
        hwobj = jetson(deviceAddress,userName,password);
    end
else
    if isempty(deviceAddress)
        hwobj = drive();
    else
        hwobj = drive(deviceAddress,userName,password);
    end
end
### 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 complete.
### Gathering hardware details...
### Checking for third-party library availability on the target...
### Gathering hardware details is complete.
Board name              : NVIDIA Jetson Nano Developer Kit
CUDA Version            : 10.2
cuDNN Version           : 8.2
TensorRT Version        : 8.2
GStreamer Version       : 1.14.5
V4L2 Version            : 1.14.2-1
SDL Version             : 1.2
OpenCV Version          : 4.1.1
Available Webcams       :  
Available GPUs          : NVIDIA Tegra X1
Available Digital Pins  : 7  11  12  13  15  16  18  19  21  22  23  24  26  29  31  32  33  35  36  37  38  40

NVIDIA ハードウェアでの Linux コマンドの実行

ボードへの正常な接続が確立されたら、MATLAB からさまざまな Linux シェル コマンドを NVIDIA ハードウェアで実行するためのボード オブジェクトのシステム メソッドを使用できます。たとえば、ターゲット ボード上のホーム フォルダーの内容を一覧表示するには、次のコマンドを使用します。

system(hwobj,'ls -al ~');

ハードウェア オブジェクトは基本的なファイル操作機能を提供します。ホストからターゲットにファイルを転送するには、ライブ ハードウェア オブジェクトの putFile() メソッドを使用します。たとえば、現在のフォルダー内の gsTestFile.txt ファイルをターゲット ボード上の remoteBuildDir に転送するには、次のコマンドを使用します。

putFile(hwobj,'gsTestFile.txt','~/remoteBuildDir');

ターゲット ボードからホスト コンピューターにファイルをコピーするには、ハードウェア オブジェクトの getFile() メソッドを使用します。次に例を示します。

getFile(hwobj,'~/remoteBuildDir/gsTestFile.txt','.');

MATLAB Coder を使用した ARM CPU 用 C++ コードの生成

この例では、gsAdd.m という単純なベクトル加算をコード生成のエントリポイント関数として使用します。

type gsAdd
function out = gsAdd(inp1,inp2) %#codegen

out = inp1 + inp2;
end

NVIDIA ターゲットに展開できる実行可能ファイルを生成するには、実行可能ファイルを生成するためのコード構成オブジェクトを作成します。

cfg = coder.config('exe');
cfg.TargetLang = 'C++';

異なるターゲットに対する複数のライブ接続オブジェクトがある場合、コード ジェネレーターは最新のライブ オブジェクトが作成されたターゲット ボードでリモート ビルドを実行します。リモート ビルドを実行するハードウェア ボードを選択するには、各ライブ ハードウェア オブジェクトの setupCodegenContext() メソッドを使用します。ライブ接続オブジェクトが 1 つしか作成されていない場合は、このメソッドを呼び出す必要がありません。

hwobj.setupCodegenContext;

DRIVE または Jetson プラットフォーム用の構成オブジェクトを作成し、それをコード構成オブジェクト cfgHardware プロパティに割り当てるには、関数coder.hardwareを使用します。Jetson ボードには 'NVIDIA Jetson' を使用し、DRIVE ボードには 'NVIDIA Drive' を使用します。

if (boardName == "jetson")
    cfg.Hardware = coder.hardware('NVIDIA Jetson');
else
    cfg.Hardware = coder.hardware('NVIDIA Drive');
end

ターゲット ボードでリモート ビルド プロセスを実行するフォルダーを指定するには、BuildDir プロパティを使用します。指定したビルド フォルダーがターゲット ボード上にない場合は、指定した名前でフォルダーが作成されます。値が cfg.Hardware.BuildDir に代入されない場合は、リモート ビルド プロセスは最後に指定されたビルド フォルダーで発生します。格納されているビルド フォルダー値がない場合、ビルド プロセスはホーム フォルダーで行われます。

cfg.Hardware.BuildDir = '~/remoteBuildDir';

カスタム gsMain.cpp ファイルは、生成コード内でエントリ ポイント関数を呼び出すラッパーです。このメイン ファイルは、最初の 100 個の自然数が含まれるベクトルをエントリポイント関数に渡します。このメイン ファイルによって、結果が gsAdd.bin バイナリ ファイルに書き込まれます。

cfg.CustomSource  = fullfile('gsMain.cpp');

C++ コードを生成するには、関数codegenを使用して、コード構成、入力サイズ、およびエントリポイント関数 gsAdd.m を渡します。ホストでコード生成が行われた後、生成されたファイルがターゲット ボードにコピーされ、そこでビルドされます。

codegen('-config ',cfg,'gsAdd','-args',{1:100,1:100});
Code generation successful.

ターゲット ボードでの ARM CPU 用実行可能ファイルの実行

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

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

Note: For the complete log, run the following command in the MATLAB command window:
system(hwobj,'cat /home/ubuntu/remoteBuildDir/MATLAB_ws/R2025b/C/Users/nrichmon/OneDrive_-_MathWorks/Documents/MATLAB/ExampleManager/nrichmon.RemoveDuplicates2/nvidia-ex79422933/gsAdd.log')

または、実行可能ファイルを実行するには、ハードウェア オブジェクトの runExecutable() メソッドを使用します。

exe = [hwobj.workspaceDir '/gsAdd.elf']; 
pid = runExecutable(hwobj,exe);

ターゲット ボードからの結果の検証

出力ビン ファイル myAdd.bin をホスト上の MATLAB 環境にコピーして、計算結果を MATLAB からの結果と比較します。workspaceDir プロパティには、ターゲット ボード上の codegen フォルダーへのパスが含まれています。

pause(0.3); % To ensure that the executable completed the execution.
getFile(hwobj,[hwobj.workspaceDir '/gsAdd.bin']);

MATLAB からのシミュレーションの結果:

simOut = gsAdd(0:99,0:99);

ターゲットからコピーされた結果のバイナリ ファイルを MATLAB で読み取ります。

fId  = fopen('gsAdd.bin','r'); 
tOut = fread(fId,'double');

MATLAB シミュレーション出力とターゲット ボードからの出力の違いを探します。

diff = simOut - tOut';

シミュレーション出力とターゲット ボードからの出力の最大偏差を表示します。

fprintf(['Maximum deviation between MATLAB Simulation output' ...
    ' and the output from the CPU on Target is: %f\n'], max(diff(:)));
Maximum deviation between MATLAB Simulation output and the output from the CPU on Target is: 0.000000

GPU Coder を使用したターゲット ボード向けの CUDA コードの生成

ターゲット ボードでの GPU 環境の検証

この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数coder.checkGpuInstallを使用します。

if (boardName == "jetson")
    envCfg = coder.gpuEnvConfig('jetson'); 
else
    envCfg = coder.gpuEnvConfig('drive'); 
end
envCfg.BasicCodegen = 1; 
envCfg.Quiet = 1;
envCfg.HardwareObject = hwobj; 
coder.checkGpuInstall(envCfg);

CUDA 実行可能ファイルの生成

NVIDIA ターゲットに展開できる CUDA 実行可能ファイルを生成するには、実行可能ファイルを生成するための GPU コード構成オブジェクトを作成します。

cfg = coder.gpuConfig('exe');
if (boardName == "jetson")
    cfg.Hardware = coder.hardware('NVIDIA Jetson');
else
    cfg.Hardware = coder.hardware('NVIDIA Drive');
end
cfg.Hardware.BuildDir = '~/remoteBuildDir';
cfg.CustomSource  = fullfile('gsMain.cu');

DRIVE PX2 などの一部の NVIDIA プラットフォームには複数の GPU が含まれています。そうしたプラットフォームでは、GPU 構成オブジェクトの SelectCudaDevice プロパティを使用して特定の GPU を選択します。

cfg.GpuConfig.SelectCudaDevice = 0;
codegen('-config ',cfg,'gsAdd','-args',{1:100,1:100});
Code generation successful.

ターゲット ボードでの GPU 用実行可能ファイルの実行

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

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

Note: For the complete log, run the following command in the MATLAB command window:
system(hwobj,'cat /home/ubuntu/remoteBuildDir/MATLAB_ws/R2025b/C/Users/nrichmon/OneDrive_-_MathWorks/Documents/MATLAB/ExampleManager/nrichmon.RemoveDuplicates2/nvidia-ex79422933/gsAdd.log')

ターゲット ボードからの結果の検証

出力ビン ファイル myAdd.bin をホスト上の MATLAB 環境にコピーして、計算結果を MATLAB からの結果と比較します。workspaceDir プロパティには、ターゲット ボード上の codegen フォルダーへのパスが含まれています。

pause(0.3); % To ensure that the executable completed the execution.
getFile(hwobj,[hwobj.workspaceDir '/gsAdd.bin']);

MATLAB からのシミュレーションの結果:

simOut = gsAdd(0:99,0:99);

ターゲットからコピーされた結果のバイナリ ファイルを MATLAB で読み取ります。

fId  = fopen('gsAdd.bin','r'); 
tOut = fread(fId,'double');

MATLAB シミュレーション出力とターゲット ボードからの出力の違いを探します。

diff = simOut - tOut';

シミュレーション出力とターゲット ボードからの出力の最大偏差を表示します。

fprintf(['Maximum deviation between MATLAB Simulation output' ...
    ' and the output from the GPU on Target is: %f\n'], max(diff(:)));
Maximum deviation between MATLAB Simulation output and the output from the GPU on Target is: 0.000000

参考

オブジェクト

トピック