主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

他の開発環境への生成コードの移動

生成コードのファイルを,MATLAB®を含まないシステムや統合開発環境(IDE)といった,他の開発環境に移動するには,コマンドラインで関数packNGoを使用するか,GPU编码器™アプリで[パッケージ]オプションを使用します。ファイルは圧縮ファイルにパッケージ化され,標準のzipユーティリティを使用して移動および解凍できます。

GPU编码器を使用して生成されたコードは,サードパーティのコンパイラとライブラリを利用して実行可能ファイルのビルドと実行を行うため,移動先の開発環境もその要件を満たしていなければなりません。詳細は,前提条件となる製品のインストール前提条件となる製品の設定を参照してください。

メモ

GPU编码器では,packNGoコマンドの“minimalHeaders”オプションをに設定する必要があります。この設定は,コードをビルドするのに必要な最低限のヘッダーファイルではなく,zipファイル内のインクルードパスで見つかったヘッダーファイルをすべてインクルードするよう,ソフトウェアに指示します。たとえば,packNGo (buildInfo minimalHeaders,假)のようにします。

GPU编码器を使用した生成コードのパッケージ化

この例では,GPU编码器アプリの[パッケージ]オプションを使用して,移動用に生成コードをzipファイルにパッケージ化する方法を説明します。この例では,ソーベルエッジ検出アプリケーションを使用してこの概念を説明します。既定では,GPU编码器は現在の作業フォルダーにzipファイルを作成します。

必要条件

NVIDIA CUDA技术®®対応ハードウェア,コンパイラ,およびライブラリ。サポートされているコンパイラおよびライブラリのバージョンの詳細は,サードパーティハードウェアを参照してください。環境変数の設定は,前提条件となる製品の設定を参照してください。

ソーベルエッジ検出エントリポイント関数

ソーベルエッジ検出アルゴリズムでは,グレースケールイメージに対する2次元の空間勾配演算が行われます。この演算は,エッジに相当する空間周波数の高い領域を強調します。

类型sobelEdge.m
Copyright 2017-2019 The MathWorks, Inc. maskX = single([-1 01;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(图像,maskY, '相同');(12级(resX。^ 2 + resY。^ 2); thresh = magnitude < 0.4; magnitude(thresh) = 0; end

ソーベルエッジ検出アルゴリズムは,2つの直交フィルターカーネル(maskXmaskY)を使用して,入力イメージの水平方向勾配(resX)と垂直方向勾配(resY)を計算します。このアルゴリズムは,フィルター処理演算を実行した後,勾配の大きさを計算してしきい値を適用し,エッジと考えられるイメージの領域を見つけます。

テストイメージに対するソーベルエッジ検出アルゴリズムの実行

ソーベルフィルター処理アルゴリズムは,グレースケールイメージに作用します。カラーイメージを,正規化された値をもつ(黒が0.0,白が1.0)等価なグレースケールイメージに変換します。

我= imread (“hello.jpg”);imGray =(0.2989 *双(im(:,: 1)) + 0.5870 *双(im(:,: 2)) + 0.1140 *双(im (:,:, 3))) / 255;imSize =大小(imGray);图();图像(im);标题(“测试图”);

writematrixコマンドを使用して,グレースケールイメージの行列をimputImage.csvファイルに書き込みます。ソーベルエッジ検出アプリケーションが,このCSVファイルを読み取ります。

writematrix(重塑(imGray 1 []),“inputImage.csv”);imOut = sobelEdge(双(imGray));

エッジが検出されたイメージを表示するには,関数repmatを使用して行列imOutを再構築し,图像コマンドに渡せるようにします。

图();图像(repmat (imOut [1 1 3]));标题(MATLAB中边缘检测图像);

sobelEdge.m主要用カスタム関数の作成

この例では,カスタムメインファイルmain_sobel.cuおよび関連するヘッダーファイルmain_sobel.hを使用します。このカスタムメインファイルは,inputImage.csvファイルから入力イメージを読み取り,生成されたsobelEdge.cuファイルの関数sobelEdgeを呼び出し,エッジが検出されたイメージのデータをoutputMag.csvファイルに保存します。

GPU编码器アプリを使用した生成コードのパッケージ化

GPU编码器アプリを開きます。MATLABツールストリップの[アプリ]タブにある[コード生成]で,GPU编码器アプリアイコンをクリックします。

ソースファイルの選択]ページで,エントリポイント関数の名前”sobelEdge.m“を入力します。[次へ]をクリックして[入力の型を定義]ページに進みます。

入力图像が可変サイズ(上限が1024)の双データ型であることを指定します。1024年上限がの可変サイズを指定するには,: 1024を選択します。[次へ]をクリックして[実行時の問題の確認]ページに進みます。

実行時の問題をチェックします。[実行時の問題の確認]ダイアログボックスで,双の入力を使用してsobelEdgeを呼び出すコードを入力します。たとえば,sobelEdge ((648484))のようにします。[問題の確認]をクリックします。実行時の問題を確認するため,アプリによって墨西哥人関数が生成され,実行されます。アプリはsobelEdgeの問題を検出しません。(次へ]をクリックして[コードの生成)ページに進みます。

生成]ダイアログボックスで,(ビルドタイプ]を[実行可能ファイル]に設定します。ソースコード,スタティックライブラリ,またはダイナミックライブラリのターゲット用に生成されたコードをパッケージ化することもできます。墨西哥人ターゲット用に生成されたコードをパッケージ化することはできません。[詳細設定]をクリックします。

生成されたファイルのカスタムCコード]の[カスタムコード]タブで,(追加ソースファイル]をmain_sobel.cuに設定します。[閉じる]をクリックして[コードの生成]ページに進みます。

生成]をクリックします。[次へ]をクリックして[ワークフローの完了]ページに進みます。[ワークフローの完了]ページで,(パッケージ]をクリックします。

パッケージ]ダイアログボックスで,パッケージファイル名とパッケージ化のタイプを指定します。既定では,アプリはプロジェクト名からパッケージファイル名を導出します。アプリは,現在の作業フォルダーにファイルを保存します。既定では,アプリは生成されたファイルを単一でサブフォルダーのないフォルダーとしてパッケージ化します。この例の場合,既定の値を使用し,(保存]をクリックします。

このzipファイルには,移動に必要なCUDA c++コードとヘッダーファイルが格納されています。以下のものは含まれません。

  • コンパイルフラグ

  • 定義

  • makefile

  • メインファイルの例(主要関数の例の生成とコンパイルを行うようにコード生成を設定した場合を除く)

作業フォルダー内のsobelEdge_pkg.zipの内容を検査し,移動先のシステムに移動する準備が整っているか確認します。使用する zip ツールによっては、解凍せずにファイルを開いて内容を検査できます。これで、得られた zip ファイルを目的の開発環境に移動して解凍できるようになりました。

コマンドラインでの生成コードのパッケージ化

関数sobelEdge用のCUDA実行可能ファイルを生成するには,GPUコード構成オブジェクトを作成してcodegenコマンドを実行します。

cfg = coder.gpuConfig (exe”);cfg。GenerateReport = true;cfg。CustomSource =“main_sobel.cu”;codegen配置cfgsobelEdgearg游戏{编码器。类型of(0,[1024 1024],[1 1])}
代码生成成功:查看报告

生成コードをzipファイルにパッケージ化するには,BuildInfoオブジェクトを読み込みます。BuildInfoには,生成コードをコンパイルしてリンクするのに必要な情報(すべてのソースとインクルードファイルの一覧,およびそれらのパス)が格納されています。

buildInfoFile = fullfile (pwd,“codegen”exe”“sobelEdge”“buildInfo.mat”);负载(buildInfoFile);

関数packNGoを使用して、邮政ファイルを作成します。

packNGo (buildInfo“packType”“平”“nestedZipFiles”,真的,...“minimalHeaders”假的,“includeReport”、假);

関数packNGoは,現在の作業フォルダーにsobelEdge.zipファイルを作成します。このzipファイルには,移動に必要なCUDA c++コードとヘッダーファイルが格納されています。以下のものは含まれません。

  • コンパイルフラグ

  • 定義

  • makefile

  • メインファイルの例(主要関数の例の生成とコンパイルを行うようにコード生成を設定した場合を除く)

作業フォルダー内のsobelEdge.zipの内容を検査し,移動先のシステムに移動する準備が整っているか確認します。使用する zip ツールによっては、解凍せずにファイルを開いて内容を検査できます。これで、得られた zip ファイルを目的の開発環境に移動して解凍できるようになりました。

スタンドアロンコードの実行

生成されたスタンドアロン実行可能ファイルを実行すると,出的力magnitudeDataが計算されてコンマ区切りのファイルに書き込まれます。この出力をMATLABに読み戻し,関数图像を使用して,エッジが検出されたイメージを可視化します。

如果ispc系统(“sobelEdge.exe”);其他的系统(”。/ sobelEdge ');结束imOutGPU =重塑(readmatrix (“outputMag.csv”), imSize);edgeImg = repmat(imOutGPU,[1 1 3]);图();图像(edgeImg);标题(“在GPU上检测到边缘图像”);

packNGoのオプションの指定

関数packNGoのオプションを指定できます。

目的 指定

ファイルのパッケージ化の構造を階層構造に変更する。

packNGo (buildInfo packType,“分层”);

ファイルのパッケージ化の構造を階層構造に変更し,プライマリzipファイルの名前を変更する。

packNGo (buildInfo packType,“层次”,…
“文件名”、“zippedsrcs”);

コードをビルドするのに必要な最低限のヘッダーファイルではなく,zipファイル内のインクルードパスで見つかったヘッダーファイルをすべてインクルードする。

GPU编码器では,このオプションを假に設定しなければなりません。

packNGo (buildInfo, minimalHeaders,假);

解析エラーと不足しているファイルの警告を生成する。

packNGo (buildInfo, ignoreParseError,真的,…
“ignoreFileMissing”,真正的);

詳細については,packNGoを参照してください。

zipファイルの構造の選択

ファイルを生成してパッケージ化する前に,サブフォルダーがないフォルダー構造にするか,階層的なフォルダー構造にするか決定してください。既定では,関数packNGoはファイルを単一でサブフォルダーのない構造としてパッケージ化します。通常はこの方法が最も簡潔で最適な選択肢です。

条件 使用
生成されたmakefileを使用しないIDEにファイルを移動するつもりである。または,必要な静的ファイルの相対位置を利用しないコードである 単一でサブフォルダーのない構造
生成されたmakefileを移動先の開発環境で使用する,またはコードがファイルの相対位置を利用するため,移動先の開発環境において移動元の開発環境のフォルダー構造を維持しなければならない 階層構造

階層構造を使用する場合,関数packNGoによって2重のzipファイルが作成されます。プライマリzipファイルの中に,次のセカンダリzipファイルが格納されます。

  • mlrFiles.zip- - - - - -matlabrootフォルダーツリー内にあるファイル

  • sDirFiles.zip——コード生成を開始したビルドフォルダー配下のファイル

  • otherFiles.zip- - - - - -matlabrootまたは开始フォルダーツリー内にない必須ファイル

セカンダリzipファイルへのパスは,プライマリzipファイルのルートフォルダーからの相対パスとなり,移動元の開発環境のフォルダー構造が維持されます。