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

Simulink® への GPU Coder™ の統合

この例では、GPU Coder™ を Simulink® に統合する方法を説明します。GPU Coder は Simulink ブロックではサポートされていませんが、GPU Coder を使用してダイナミック リンク ライブラリ (dll) を生成し、次に coder.ExternalDependency API を使用してそれを Simulink ブロックに統合することにより、Simulink で GPU を活用することはできます。この概念を説明するための例として、ソーベル エッジ検出を使用します。

必要条件

  • Compute Capability 3.0 以上の CUDA 対応 NVIDIA® GPU。

  • NVIDIA CUDA ツールキット。

  • コンパイラおよびライブラリの環境変数。詳細は、環境変数を参照してください。

  • Simulink (Simulink のモデルを作成するため)。

  • Computer Vision Toolbox™ (この例で使用するビデオ リーダーとビューアーを使うため)。

新規フォルダーの作成と関連ファイルのコピー

次のコード行は、現在の作業フォルダー (pwd) にフォルダーを作成し、すべての関連ファイルをこのフォルダーにコピーします。この操作を実行したくない、またはこのフォルダーにファイルを生成できない場合、現在の作業フォルダーを変更してください。

gpucoderdemo_setup('gpucoderdemo_in_simulink');

GPU 環境の検証

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

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

ソーベル エッジ検出

関数 sobelEdge.m は、(1 つの行列として表現された) イメージを受け取り、エッジが検出されたイメージを返します。

type sobelEdge
function [ magnitude ] = sobelEdge( Image )
%#codegen

%   Copyright 2017 The MathWorks, Inc.


maskX = single([-1 0 1 ; -2 0 2; -1 0 1]);
maskY = single([-1 -2 -1 ; 0 0 0 ; 1 2 1]);

coder.gpu.kernelfun();



resX = conv2(Image, maskX, 'same');
resY = conv2(Image, maskY, 'same');

magnitude = sqrt(resX.^2 + resY.^2);
thresh = magnitude < 0.4;
magnitude(thresh) = 0;

end

関数の DLL の生成

この関数を Simulink から GPU で実行するには、GPU Coder を使用して共有ライブラリを生成し、coder.ExternalDependency API を使用して Simulink からその生成コード (ライブラリ) を呼び出します。生成されたライブラリを最上位ディレクトリにコピーします。

Isize = single(zeros(240, 320));
cfg = coder.gpuConfig('dll');
codegen -args {Isize} -config cfg sobelEdge
if ispc
    copyfile(fullfile(pwd, 'codegen','dll', 'sobelEdge','sobelEdge.dll'), pwd);
else
    copyfile(fullfile(pwd, 'codegen','dll', 'sobelEdge','sobelEdge.so'), pwd);
end

C/CUDA コードを生成する前に、まず、MATLAB® で MEX 関数をテストし、これが元の MATLAB コードと機能的に同等であることと、実行時エラーが発生しないことを確認してください。

生成コードを呼び出す coder.ExternalDependency API の定義

SobelAPI.m は、生成された DLL を呼び出すための API を定義するクラスです。この関数のほとんどは標準テンプレートです。注目のメソッドは SobelAPI.sobelEdge です。これは DLL を実行するために呼び出されます。この関数では単純に、coder.ceval 呼び出しを介して sobelEdge DLL を呼び出しています。

type SobelAPI

%   Copyright 2017 The MathWorks, Inc.

classdef SobelAPI < coder.ExternalDependency
    %#codegen
    
    methods (Static)
        
        function bName = getDescriptiveName(~)
            bName = 'SobelAPI';
        end
        
        function tf = isSupportedContext(ctx)
            if  ctx.isMatlabHostTarget()
                tf = true;
            else
                error('sobel library not available for this target');
            end
        end
        
        function updateBuildInfo(buildInfo, ctx)
            [~, linkLibExt, execLibExt, ~] = ctx.getStdLibInfo();
            
            % Header files
            hdrFilePath = fullfile(pwd, 'codegen', 'dll', 'sobelEdge');
            buildInfo.addIncludePaths(hdrFilePath);
            
            % Link files
            linkFiles = strcat('sobelEdge', linkLibExt);
            linkPath = hdrFilePath;
            linkPriority = '';
            linkPrecompiled = true;
            linkLinkOnly = true;
            group = '';
            buildInfo.addLinkObjects(linkFiles, linkPath, ...
                linkPriority, linkPrecompiled, linkLinkOnly, group);
            
            % Non-build files
            nbFiles = 'sobelEdge';
            nbFiles = strcat(nbFiles, execLibExt);
            buildInfo.addNonBuildFiles(nbFiles,'','');
        end
        
        %API for library function 'sobelEdge'
        function c = sobelEdge(I)
            % running in generated code, call library function
            coder.cinclude('sobelEdge.h');
            
            c = coder.nullcopy(I);
            coder.ceval('sobelEdge', coder.rref(I), coder.wref(c));
        end
    end
end

% LocalWords:  sobel

API を DLL に統合する Simulink モデルの作成

Simulink で、SobelAPI.sobelEdge を呼び出す MATLAB Function ブロックを作成します。これは、GPU Coder により生成された DLL コードを実行するのと同じです。そのため、この MATLAB Function ブロックが実行されると、この DLL がホスト マシンの GPU で実行されます。また、Simulink からのコード生成についても同様に、CUDA コードが呼び出されます。Simulink モデルはビデオ リーダーとビデオ表示を使用してアルゴリズムの効果を示します。

open_system('gpucoder_sobelEdge');
set_param('gpucoder_sobelEdge', 'SimulationCommand', 'update');

Simulink モデル (ソーベル フィルター) の実行

シミュレーションを実行してソーベル アルゴリズムの効果を確認します。

sim('gpucoder_sobelEdge', 'timeout', 30);

クリーンアップ

ファイルを削除し、元のフォルダーに戻します。

コマンドの実行: クリーンアップ

close_system('gpucoder_sobelEdge');
cleanup