このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
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で構成された複素平面の領域です。
マンデルブロ集合の全体的な幾何形状を図に示しています。この図には,集合の境界の外側周辺における詳しい構造を十分に示すための解像度がありません。拡大率を上げていくと,マンデルブロ集合の詳細な境界が示され,そこでは徐々に細かくなりながら細部が繰り返されていることがわかります。
このチュートリアルでは,メインのカージオイドとその左側にある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スクリプトを作成します。このスクリプトは,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)imagesc(x, y, count);Colormap ([jet();flipud(jet());0 0 0]);轴从标题(MATLAB中的Mandelbrot集);
MATLABバージョンのマンデルブロ集合アルゴリズムをコード生成に適したものにする前に,元のコードの機能をテストできます。
MATLABの現在の作業フォルダーを,前の手順で作成した2つのファイルが含まれた場所に変更します。GPU编码器はこのフォルダーに生成コード配置し、このフォルダーに対する完全なアクセス権がない場合は現在の作業フォルダーを変更します。
Matlabエディタ,でmandelbrot_test
スクリプトを開きます。
実行ボタンをクリックするか,matlabコマンドウィンドウにmandelbrot_test
を入力して,テストスクリプトを実行します。
テストスクリプトが実行され,変数xlim
およびylim
により設定された境界内のマンデルブロの幾何形状が表示されます。
Matlabコドをコド生成に適したものにするプロセスを始める前に,ファルmandelbrot_count.m
を使用します。
MATLABの現在のフォルダーを,このチュートリアル用のファイルが含まれた作業フォルダーに設定します。
Matlabエディタ,で,mandelbrot_count.m
を開きます。ファ转换器ルがmatlabエディタ转换器で開きます。MATLABエディターの右上隅にあるコード アナライザー メッセージ インジケーターは緑色になっています。アナライザーは、コード内にエラー、警告、および改善機会を検出しませんでした。
Matlabのコ,ド生成エラ,チェックをオンにします。関数宣言の後ろに% # codegen
命令を追加します。
函数count = mandelbrot_count(maxIterations, xGrid, yGrid)% # codegen
コドアナラザメッセジンジケタは緑色のままです。これはコ,ド生成の問題が検出されていないことを示します。
関数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にマッピングしようとします。
ファ@ @ルを保存します。コマンドラ。
GPU编码器アプリを使用する代わりに,codegen
コマンドを使用して,MATLAB関数をCUDAと互換性のあるスタティックライブラリ,ダイナミックライブラリ,実行可能ファイル,または墨西哥人関数に変換できます。
コンパイル時に,GPU编码器はエントリポイント関数のすべての入力についてデータ型を把握していなければなりません。そのため,エントリポaaplント関数に入力がある場合は,関数codegen
が含まれたファ@ @ルのコンパ@ @ル時にその入力のデ@ @タ型を指定する必要があります。
入力を生成してから,関数codegen
にarg游戏
オプションを使用することで,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ファ超市ルの正確性を検証するには,生成コ,ドの正確性の検証を参照してください。