主要内容

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

コマンドランンタスを使用したコ

CUDA®カ,ネルを作成する最も簡単な方法は,coder.gpu.kernelfunプラグマを"基本"MATLAB®関数に配置することです。基本関数は,"最上位"関数または“エントリポ电子邮箱ント”関数とも呼ばれます。GPU编码器™ はkernelfunプラグマを検出すると,この関数内のすべての計算を並列化し,その計算をGPUにマッピングしようとします。

学習目標

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

  • kernelfunプラグマを使用したcudaコ,ド生成のためのmatlabコ,ドの準備。

  • GPU编码器プロジェクトの作成と設定。

  • 関数入力のプロパティの定義。

  • コ,ド生成の準備状態と実行時の問題のチェック。

  • コ,ド生成のプロパティの指定。

  • codegenコマンドを使用したcudaコ,ドの生成。

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

このチュ,トリアルには,次の製品が必要です。

  • MATLAB

  • MATLAB编码器™

  • GPU编码器

  • Cコンパescラ

  • Cuda対応nvidia®GPU

  • Cuda

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

例:マンデルブロ集合

説明

マンデルブロ集合とは,下記の方程式で定義された軌跡がk→∞のときに有限の範囲内にとどまる値z0で構成された複素平面の領域です。

z k + 1 z k 2 + z 0 k 0 1 ...

マンデルブロ集合の全体的な幾何形状を図に示しています。この図には,集合の境界の外側周辺における詳しい構造を十分に示すための解像度がありません。拡大率を上げていくと,マンデルブロ集合の詳細な境界が示され,そこでは徐々に細かくなりながら細部が繰り返されていることがわかります。

Mandelbrot集合的几何

アルゴリズム

このチュートリアルでは,メインのカージオイドとその左側にある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実装です。このチュトリアルでは後ほど,コド生成に適するようにこのファルを変更します。

函数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スクリプトを作成します。このスクリプトは,xlimylimで指定した範囲間に実数部(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)imagesc(x, y, count);Colormap ([jet();flipud(jet());0 0 0]);轴标题(MATLAB中的Mandelbrot集);

元のMATLABコ,ドの実行

マンデルブロの例の実行

MATLABバージョンのマンデルブロ集合アルゴリズムをコード生成に適したものにする前に,元のコードの機能をテストできます。

  1. MATLABの現在の作業フォルダーを,前の手順で作成した2つのファイルが含まれた場所に変更します。GPU编码器はこのフォルダーに生成コード配置し、このフォルダーに対する完全なアクセス権がない場合は現在の作業フォルダーを変更します。

  2. Matlabエディタ,でmandelbrot_testスクリプトを開きます。

  3. 実行ボタンをクリックするか,matlabコマンドウィンドウにmandelbrot_testを入力して,テストスクリプトを実行します。

    テストスクリプトが実行され,変数xlimおよびylimにより設定された境界内のマンデルブロの幾何形状が表示されます。

    MATLAB中Mandelbrot集的图

コ,ド生成に適したMATLABコ,ドの作成

Matlabコドをコド生成に適したものにするプロセスを始める前に,ファルmandelbrot_count.mを使用します。

  1. MATLABの現在のフォルダーを,このチュートリアル用のファイルが含まれた作業フォルダーに設定します。

  2. Matlabエディタ,で,mandelbrot_count.mを開きます。ファ转换器ルがmatlabエディタ转换器で開きます。MATLABエディターの右上隅にあるコード アナライザー メッセージ インジケーターは緑色になっています。アナライザーは、コード内にエラー、警告、および改善機会を検出しませんでした。

  3. Matlabのコ,ド生成エラ,チェックをオンにします。関数宣言の後ろに% # codegen命令を追加します。

    函数count = mandelbrot_count(maxIterations, xGrid, yGrid)% # codegen

    コドアナラザメッセジンジケタは緑色のままです。これはコ,ド生成の問題が検出されていないことを示します。

  4. 関数mandelbrot_countをcudaカ,ネルにマッピングするには,元のmatlabコ,ドを変更し,ル,プ本体の外にcoder.gpu.kernelfunプラグマを配置します。

    函数count = mandelbrot_count(maxIterations, xGrid, yGrid)% # codegen% mandelbrot计算z0 = xGrid + 1i*yGrid;Count = ones(size(z0));添加Kernelfun pragma来触发内核创建coder.gpu.kernelfun;Z = z0;n = 0:maxIterations z = z.*z + z0;Inside = abs(z)<=2;计数=计数+内部;结束Count = log(Count);

    coder.gpu.kernelfunプラグマの使用時は,GPU编码器は関数mandelbrot_countの計算をgpuにマッピングしようとします。

  5. ファ@ @ルを保存します。コマンドラ。

コマンドラ▪▪ンからのコ▪▪ド生成

GPU编码器アプリを使用する代わりに,codegenコマンドを使用して,MATLAB関数をCUDAと互換性のあるスタティックライブラリ,ダイナミックライブラリ,実行可能ファイル,または墨西哥人関数に変換できます。

入力の型を定義

コンパイル時に,GPU编码器はエントリポイント関数のすべての入力についてデータ型を把握していなければなりません。そのため,エントリポaaplント関数に入力がある場合は,関数codegenが含まれたファ@ @ルのコンパ@ @ル時にその入力のデ@ @タ型を指定する必要があります。

入力を生成してから,関数codegenarg游戏オプションを使用することで,GPU编码器で入力パラメーターのクラス,サイズ,および実数/複素数を特定できるようになります。関数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);

または,関数coder.typeofを使用して,入力データを生成せずに,エントリポイント関数の入力のサイズ,型,および実数/複素数を指定できます。

ARGS = cell(1,1);ARGS{1} = cell(3,1);ARGS{1}{1} = code .typeof(0);ARGS{1}{2} =编码器。typeof(0, 1000年[1000]);ARGS{1}{3} =编码器。typeof(0, 1000年[1000]);

ビルド構成

出力ファイル名,場所,タイプなどのビルド設定を構成するには,コーダー構成オブジェクトを作成しなければなりません。このオブジェクトを作成するには,関数coder.gpuConfigを使用します。たとえば,mex関数の生成時にcodegenで使用する编码器。MexCodeConfigコ,ド生成オブジェクトを作成するには,以下を使用します。

cfg = code . gpuconfig ('mex');

その他の利用可能なオプションは次のとおりです。

  • cfg = code . gpuconfig ('lib');, cudaスタティックラ显卡ブラリの生成時にcodegenで使用するコ,ド生成構成オブジェクトを作成します。

  • cfg = code . gpuconfig ('dll');, cudaダaapl . exeナミックラaapl . exeブラリの生成時にcodegenで使用するコ,ド生成構成オブジェクトを作成します。

  • cfg = code . gpuconfig ('exe');, cuda実行可能ファ显卡ルの生成時にcodegenで使用するコ,ド生成構成オブジェクトを作成します。

詳細にいては,coder.gpuConfigを参照してください。

各構成オブジェクトには,既定値に初期化された一連のパラメ,タ,が伴います。ドット表記を使用して,一度に1の構成オブジェクトのパラメタの値を変更できます。次の構文を使用します。

configuration_object。属性= value

次の同等のコマンドラ电子邮箱ンを使用して,GPU编码器アプリを使用したコ,ド生成と同じ設定を有効にすることができます。

cfg = code . gpuconfig (墨西哥人的);cfg.GpuConfig.CompilerFlags =“——fmad = false”;cfg。GenerateReport = true;

cfg構成オブジェクトには,MATLAB编码器とGPU编码器に共通する構成パラメーターと,GPU编码器固有のパラメーターがあります。Matlabコマンドウィンドウに”cfg。GpuConfigと入力することで,cfg構成オブジェクトで利用できるすべてのgpu固有のプロパティを確認できます。

> > cfg。GpuConfig ans = config with properties: Enabled: 1 MallocMode: 'discrete' KernelNamePrefix: " EnableCUBLAS: 1 EnableCUSOLVER: 1 EnableCUFFT: 1 Benchmarking: 0 SafeBuild: 0 ComputeCapability: '3.5' CustomComputeCapability: " CompilerFlags: " StackLimitPerThread: 1024 MallocThreshold: 200 SelectCudaDevice: -1

——fmad = falseフラグは,学校网站に渡すと,浮動小数点積和演算(fmad)最適化を無効にするようにこのコンパaaplラに指示します。このオプションは、CPUとGPUのアーキテクチャの違いが原因で,生成コード上の数値の不一致を防ぐために設定します。詳細は,CPUとgpuの数値の差を参照してください。

MATLAB编码器とGPU编码器に共通する構成パラメ,タ,の詳細に编码器。CodeConfigクラスを参照してください。

ビルドスクリプト

前述した一連のコマンドを自動化するビルドスクリプトmandelbrot_codegen.mを作成できます。

% GPU代码生成入门示例(mandelbrot_count.m)创建类'code . mexcodeconfig '的配置对象。cfg = code . gpuconfig (墨西哥人的);cfg。GenerateReport = true;cfg.GpuConfig.CompilerFlags =“——fmad = false”为入口点'mandelbrot_count'定义参数类型。ARGS = cell(1,1);ARGS{1} = cell(3,1);ARGS{1}{1} = code .typeof(0);ARGS{1}{2} =编码器。typeof(0, 1000年[1000]);ARGS{1}{3} =编码器。typeof(0, 1000年[1000]);调用GPU编码器。codegen配置cfgmandelbrot_countarg游戏ARGS {1}

codegenコマンドはファ@ @ルmandelbrot_count.mを開き,matlabコ,ドをcudaコ,ドに変換します。

  • 报告オプションは,matlabコ,ドのデバッグに使用できるコ,ド生成レポ,トを生成するようにcodegenに指示します。

  • arg游戏オプションは,入力パラメーターmaxIterations, xGrid,およびyGridのクラス,サイズ,および実数/複素数を使用して,ファイルmandelbrot_count.mをコンパ@ @ルするようにcodegenに指示します。

  • 配置オプションは,指定した構成オブジェクトをコ,ド生成に使用するようにcodegenに指示します。

コ,ド生成に成功したら,matlabコマンドウィンドウで[レポ,トの表示]をクリックすることで,結果のコ,ド生成レポ,トを表示できます。

>> mandelbrot_codegen代码生成成功:查看报告

代码生成报告窗口

生成コ,ドの正確性の検証

生成されたmexファ超市ルの正確性を検証するには,生成コ,ドの正確性の検証を参照してください。

参考

アプリ

関数

オブジェクト

関連するトピック