このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
CUDA®カ,ネルを作成する最も簡単な方法は,coder.gpu.kernelfun
プラグマを"基本"MATLAB®関数に配置することです。基本関数は,"最上位"関数または“エントリポ电子邮箱ント”関数とも呼ばれます。GPU编码器™ はkernelfun
プラグマを検出すると,この関数内のすべての計算を並列化し,その計算をGPUにマッピングしようとします。Gpuカネルの詳細にいては,显卡プログラミングのパラダ显卡ムを参照してください。
このチュ,トリアルでは,次の方法を学びます。
kernelfun
プラグマを使用したcudaコ,ド生成のためのmatlabコ,ドの準備。
GPU编码器プロジェクトの作成と設定。
関数入力のプロパティの定義。
コ,ド生成の準備状態と実行時の問題のチェック。
コ,ド生成のプロパティの指定。
GPU编码器アプリを使用したCUDAコ,ドの生成。
このチュ,トリアルには,次の製品が必要です。
MATLAB
MATLAB编码器™
GPU编码器
c++コンパaapl . exeラ
Cuda対応nvidia®GPU
Cuda
コンパ▪▪ラおよびラ▪▪ブラリの環境変数。詳細にいては,環境変数を参照してください。
マンデルブロ集合とは,下記の方程式で定義された軌跡がk→∞のときに有限の範囲内にとどまる値z0で構成された複素平面の領域です。
マンデルブロ集合の全体的な幾何形状を図に示しています。この図には,集合の境界の外側周辺における詳しい構造を十分に示すための解像度がありません。拡大率を上げていくと,マンデルブロ集合の詳細な境界が示され,そこでは徐々に細かくなりながら細部が繰り返されていることがわかります。
このチュートリアルでは,メインのカージオイドとその左側にあるp / q球状部との谷間にある,マンデルブロ集合の大きく拡大された部分を指定する一連の範囲を選択します。これらの2つの範囲間に,実数部(x)と虚数部(y)の1000 x 1000のグリッドを作成します。次に,マンデルブロアルゴリズムを各グリッド位置で反復します。500回の反復回数で,完全な解像度のメジがレンダリングされます。
maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161,-0.748766707771757];Ylim = [0.123640844894862,0.123640851045266];
このチュートリアルでは,CPUで実行される標準のMATLABコマンドを使ったマンデルブロ集合の実装を使用します。この計算はすべての場所が同時に更新されるようにベクトル化されています。
次のコ,ド行を使用してmandelbrot_count.m
というmatlab関数を作成します。このコドは,マンデルブロ集合のベスランベクトル化済みのmatlab実装です。これは,グリッドのすべての点(xGrid yGrid)
にいて,方程式で定義された軌跡の原点からの距離が2
になる反復@ @ンデックス数
を計算します。次に,数
の自然対数を返します。これはマンデルブロ集合の色分けされたプロットを生成するために使用されます。このチュトリアルでは後ほど,コド生成に適するようにこのファルを変更します。
函数count = mandelbrot_count(maxIterations,xGrid,yGrid)% mandelbrot计算z0 = xGrid + 1i*yGrid;Count = ones(size(z0));Z = z0;为n = 0:maxIterations z = z.*z + z0;Inside = abs(z)<=2;计数=计数+内部;结束Count = log(Count);
次のコ,ド行を使用してmandelbrot_test.m
というmatlabスクリプトを作成します。このスクリプトは,xlim
とylim
で指定した範囲間に実数部(x)と虚数部(y)の1000 x 1000のグリッドを生成します。また,関数mandelbrot_count
を呼び出して,結果のマンデルブロ集合をプロットします。
maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161,-0.748766707771757];Ylim = [0.123640844894862,0.123640851045266];x = linspace(xlim(1),xlim(2),gridSize);y = linspace(ylim(1),ylim(2),gridSize);[xGrid,yGrid] = meshgrid(x,y);%% Mandelbrot计算MATLABcount = mandelbrot_count(maxIterations,xGrid,yGrid);%显示图(1)显示亮度图像(x, y,数);Colormap ([jet();flipud(jet());0 0 0]);轴从标题(MATLAB中的Mandelbrot集);
MATLABバージョンのマンデルブロ集合アルゴリズムをコード生成に適したものにする前に,元のコードの機能をテストできます。
現在のmatlab作業フォルダ,をmandelbrot_count.m
とmandelbrot_test.m
が含まれた場所に変更します。GPU编码器はこのフォルダーに生成コードを配置します。このフォルダーに対する完全なアクセス権がない場合は現在の作業フォルダーを変更してください。
mandelbrot_test
スクリプトを実行します。
テストスクリプトが実行され,変数xlim
およびylim
により設定された境界内のマンデルブロの幾何形状が表示されます。
GPU编码器でコードを生成する前に,元のMATLABコードにおけるコーディングの問題をチェックします。
設計時にコド生成の問題を検出するのに役立次の2のルがあります。
コドアナラザル
コド生成の準備状態ル
コードアナライザーは,MATLABエディターに組み込まれたツールであり,入力されたコードを継続的にチェックします。コードアナライザーは問題を報告し,コードのパフォーマンスと保守性を最大化するための変更を提案します。Matlabコ,ドからのコ,ド生成に固有の警告とエラ,を識別するには,% # codegen
命令をmatlabファescルに追加します。詳細にいては,コドアナラザ基本設定を参照してください。
メモ
コドアナラザは,コド生成の問題をすべて検出するわけではありません。コードアナライザーで検出されたエラーや警告を取り除いた後,コードに他のコンプライアンスの問題があるかどうかを確認するには,GPU编码器を使用してコードをコンパイルします。
コード生成の準備状態ツールは,コード生成でサポートされていない機能と関数について,MATLABコードをスクリーニングします。このツールで提供されるレポートには,MATLABコードをコード生成に適したものにするための問題と推奨事項が一覧表示されます。コド生成の準備状態ルには次の方法でアクセスできます。
[現在のフォルダー]ブラウザーで,エントリポイント関数を含むMATLABファイルを右クリックします。
コマンドラ电子邮箱ンで,gpu
フラグを付けて関数coder.screener
を使用します。
GPU编码器アプリで,エントリポイントファイルを指定した後,コードアナライザーおよびコード生成の準備状態ツールを実行します。
GPU编码器を使用して,コ,ド生成時の問題をチェックできます。GPU编码器によりエラーまたは警告が検出されると、問題の説明と、問題のある MATLAB コードへのリンクが用意されたエラー レポートが生成されます。詳細については、コ,ド生成レポ,トを参照してください。
Matlabコドをコド生成に適したものにするプロセスを始める前に,ファルmandelbrot_count.m
を使用します。
MATLABの現在のフォルダーを,このチュートリアル用のファイルが含まれた作業フォルダーに設定します。
Matlabエディタ,で,mandelbrot_count.m
を開きます。MATLABエディターの右上隅にあるコード アナライザー メッセージ インジケーターは緑色になっています。アナライザーは、コード内にエラー、警告、および改善機会を検出しませんでした。
関数宣言の後ろに% # codegen
命令を追加して,コ,ド生成に固有のエラ,チェックをオンにします。
函数count = mandelbrot_count(maxIterations,xGrid,yGrid)% # codegen
コドアナラザメッセジンジケタは緑色のままです。これはコ,ド生成の問題が検出されていないことを示します。
関数mandelbrot_count
をcudaカネルにマッピングするには,元のmatlabコドを変更し,関数の本体にcoder.gpu.kernelfun
プラグマを配置します。
函数count = mandelbrot_count(maxIterations,xGrid,yGrid)% # codegen添加kernelfun pragma来触发内核创建coder.gpu.kernelfun;% mandelbrot计算z0 = xGrid + 1i*yGrid;Count = ones(size(z0));Z = z0;为n = 0:maxIterations z = z.*z + z0;Inside = abs(z)<=2;计数=计数+内部;结束Count = log(Count);
coder.gpu.kernelfun
プラグマを使用すると,GPU编码器は関数mandelbrot_count
の計算をgpuにマッピングしようとします。
ファ@ @ルを保存します。GPU编码器アプリを使用してコードをコンパイルする準備が整いました。
Matlabルストリップの[アプリ]タブにある[コ,ド生成]で,GPU编码器アプリア显卡コンをクリックします。また,matlabコマンドウィンドウで"gpucoder
と入力してもアプリを開くことができます。[ソスファルの選択]ペ,ジが開きます。
[ソスファルの選択]ペ,ジで,"基本"関数mandelbrot_count
の名前を入力または選択します。基本関数は,"最上位"関数または“エントリポ电子邮箱ント”関数とも呼ばれます。アプリによって,mandelbrot_count.prj
という既定の名前が付いたプロジェクトが現在のフォルダ,に作成されます。
[次へ]をクリックして[入力の型を定義]手順に進みます。アプリにより、コーディング問題とコード生成の準備状態について関数が解析されます。アプリで問題が特定された場合は、[コ,ド生成の準備状態の確認]ペ,ジが開き,そこで問題を確認および修正できます。この例では,アプリは問題を検出しないため,[入力の型を定義]ペ,ジが開きます。
コードジェネレーターはコンパイル時にMATLABファイル内のすべての変数のデータ型を決定しなければなりません。そのため,すべての入力変数のデ,タ型を指定する必要があります。入力デタ型は次の2の方法で指定できます。
プロジェクトのエントリポ▪▪ント関数を呼び出すテストファ▪▪ルを指定。GPU编码器アプリはテスト ファイルを実行することで入力引数の型を推測できます。
入力の型を直接入力。
入力仕様の詳細にいては,入力仕様を参照してください。
この例では,入力maxIterations
、xGrid
,およびyGrid
のプロパティを定義するために,テストファmandelbrot_test.m
を指定します。
テストファ@ @ルmandelbrot_test.m
を入力または選択します。
[入力の型の自動定義]をクリックします。
テストファ@ @ルmandelbrot_test.m
は,想定される入力の型を使用してエントリポmandelbrot_count.m
を呼び出します。アプリは入力maxIterations
が双(1 x1)
であり,入力xGrid
およびyGrid
が双(1000 x1000)
であると推測します。
[次へ]をクリックして[実行時の問題の確認]手順に進みます。
[実行時の問題の確認]手順では,エントリポイント関数から墨西哥人ファイルが生成され,墨西哥人関数を実行して,問題が報告されます。この手順はオプションです。ただし,この手順を実行することをお勧めします。この手順を使用して,生成されたgpuコ,ドでの診断が難しい欠陥を検出および修正できます。
この時点で,GPU编码器によってGPU固有のチェックを実行するオプションが提供されます。このオプションを選択すると,GPU编码器は,エントリポイント関数からCUDAコードと墨西哥人ファイルを生成し,墨西哥人関数を実行して,問題を報告します。以下はgpu固有の実行時チェックの一部です。
レジスタスピルのチェック。
スタックサ@ @ズの適合性チェック。
メモ
コド内に存在する特定のmatlabコンストラクトが原因で,[実行時の問題の確認]でCPU固有のチェックに失敗しても,gpu固有のチェックはパスする場合があります。
[実行時の問題の確認]ダ电子邮箱アログボックスを開くには,[問題の確認]矢印をクリックします。
[実行時の問題の確認]ダイアログボックスで,テストファイルを指定するか,入力例を使用してエントリポイント関数を呼び出すコードを入力します。この例では,入力の型を定義するために使用したテストファmandelbrot_test.m
を使用します。
Gpu固有のチェックを有効にするには,(GPU)オプションボタンを選択します。[問題の確認]をクリックします。
アプリによってmex関数が生成されます。mandelbrot_count
の呼び出しと生成されたmexの呼び出しを置き換えて,テストスクリプトmandelbrot_test
が実行されます。墨西哥人関数の生成時または実行時にアプリにより問題が検出された場合は、警告およびエラー メッセージが表示されます。これらのメッセージをクリックすると、問題のあるコードに移動して、その問題を修正できます。この例では、アプリは問題を検出しません。MEX 関数には元の関数mandelbrot_count
と同じ機能があります。
メモ
コド内に存在する特定のmatlabコンストラクトが原因で,[実行時の問題の確認]でCPU固有のチェックに失敗しても,gpu固有のチェックはパスする場合があります。
[次へ]をクリックして[コ,ド生成]手順に進みます。
[生成]ダ电子邮箱アログボックスを開くには,[生成]矢印をクリックします。
[生成]ダ显卡编码器で実行するビルドのタ显卡编码器プを選択できます。利用可能なオプションを次の表に示します。
ビルドタ@ @プ | 説明 |
---|---|
ソ,スコ,ド |
外部プロジェクトと統合されるcudaソ,スコ,ド。 |
墨西哥人 |
Matlab内で実行するコンパ转换器ル済みコ转换器ド。 |
スタティックラ@ @ブラリ |
外部プロジェクトとの静的なリンクに使用されるバ▪▪ナリラ▪▪ブラリ。 |
ダ▪▪ナミックラ▪▪ブラリ |
外部プロジェクトとの動的なリンクに使用されるバ▪▪ナリラ▪▪ブラリ。 |
実行可能ファ@ @ル |
スタンドアロンプログラム(cudaのカスタムのメンファルが必要)。 |
このチュ,トリアルでは,[ビルドタ电子邮箱プ]を(墨西哥人(.mex)]
に設定します。墨西哥人出力を生成することにより、生成された CUDA コードの正確性を MATLAB 内からチェックできます。MEX ビルド タイプに、[ン]や[ハ,ドウェアボ,ド]のような追加設定は不要です。また,ソ,スコ,ドのみを生成するオプションは提供されません。環境変数が適切に設定されている限り,GPU编码器は利用可能なCUDAツールチェーンを自動的に選択できます。
詳細オプションを表示するには,[詳細設定],[gpuコ.ド]を選択します。[コンパ电子邮箱ラフラグ]オプションに,——fmad = false
を追加します。このフラグは,学校网站
に渡すと,浮動小数点積和演算(fmad)最適化を無効にするようにこのコンパaaplラに指示します。このオプションは、CPUとGPUのアーキテクチャの違いが原因で生成コードで数値の不一致が生じることを防ぐために設定します。詳細にいては,CPUとgpuの数値の差を参照してください。
[生成]をクリックします。
GPU编码器はMEX実行可能ファ电子编码器ルmandelbrot_count_mex
を作業フォルダ,に生成します。< pwd > \ codegen \墨西哥人\ mandelbrot_count
フォルダーには,CUDAソース(* .cu)ファイルおよびヘッダーファイルを含む,他のすべての生成されたファイルが含まれます。GPU编码器アプリに,コ,ド生成が成功したことが示されます。ペジの左側には,ソスmatlabファルと生成された出力ファルが表示されます。[変数]タブには,matlabソ,スの変数に関する情報が表示されます。[タ,ゲットのビルドログ]タブには,コンパ。既定では,アプリはコ,ドウィンドウに,cudaソ,スファ,ルmandelbrot_count.cu
を表示します。別のファ电子邮箱ルを表示するには,[ソ,スコ,ド]または[出力ファ电子邮箱ル]ペ▪▪ンでファ▪▪ル名をクリックします。
コ,ド生成レポ,トを表示するには,[レポ,トの表示]をクリックします。レポートには,MATLABコードと生成されたCUDA (* .cu)ファイルへのリンクが用意されています。また,matlabコ,ド内の変数と式に関するコンパ,ル時の情報も提供されます。この情報は,エラ,および警告の原因を探すのに役立,ます。また,コ,ド内のコ,ド生成の問題をデバッグすることにも役立,ます。詳細にいては,コ,ド生成レポ,トを参照してください。
[生成コ,ド]タブの[gpuカ.ネル]セクションでは,gpuコ,ドの生成時に作成されたカ,ネルの一覧が提供されます。この一覧の項目は関連するソ,スコ,ドにリンクされています。たとえば,(mandelbrot_count_kernel1)をクリックすると,このカ,ネルのコ,ドセクションがコ,ドブラウザ,ウィンドウに表示されます。
レポ,トの確認後,[コ,ド生成レポ,ト]ウィンドウを閉じることができます。後でレポ,トを表示するには,< pwd > \ codegen \墨西哥人\ mandelbrot_cout \ html
フォルダ,にあるreport.mldatx
を開きます。
< pwd > \ codegen \墨西哥人\ mandelbrot_count
内には,生成されたgpuコ,ドの統計を含むgpu_codegen_info.mat
垫子ファeconrルがあります。この垫ファイル内には,スレッドとブロックのサイズ,共有メモリと定数メモリの使用量,および各カーネルの入力引数と出力引数に関する情報を含んだ変数cuda_Kernel
があります。変数cudaMalloc
およびcudaMemcpy
は,すべてのgpu変数のサaapl . exeズと,ホストおよびデバaapl . exeス間でのmemcpy
呼び出しの数に関する情報を含みます。
GPU编码器アプリで,[次へ]をクリックし,[ワ,クフロ,の完了]ペ,ジを開きます。
[ワ,クフロ,の完了]ペ,ジに,コ,ド生成が成功したことが示されます。プロジェクトの概要と,MATLABソースファイル,コード生成レポート,および生成された出力バイナリへのリンクが提供されます。現在のGPU编码器プロジェクトの構成パラメーターをMATLABスクリプトとして保存できます。MATLABスクリプトへのMATLAB Coderプロジェクトの変換を参照してください。
生成されたmexファ超市ルの正確性を検証するには,生成コ,ドの正確性の検証を参照してください。