主要内容

coder.gpu.kernel

为了ループをgpuカーネルにマッピングプラグマプラグマプラグマ

说明

coder.gpu.kernel()for的ループのに配置なければならないのプラグマ。ループパラメーターから计算したた次元のカーネルをを生成

メモ

coder.gpu.kernelプラグマはソフトウェア実行さすべてのループ解析チェックがオーバーライドささ。。。coder.gpu.kernelプラグマの高度机能をする前に,,coder.gpu.kernelfunを使用しください。

coder.gpu.kernel(b,t)は,ループ直前配置しループレベルプラグマです。。bおよびtで指定たのカーネル生成します。B [BX,BY,1]は,次元Xおよびy((zは使用ません)に沿っグリッドの数定义するです。。T [TX,TY,TZ]は,次元Xy,およびzに沿っブロックスレッド数定义する配列です。

bおよびtの-1の -の场合,,,,,,,,で自动グリッドとブロック次元次元を推测ししなければならないことををcoder.gpu.kernelプラグマはなグリッドブロックの次元エラー生成生成します。

coder.gpu.kernel(b,t,m,名称)は,同じ引数bおよびtを想定ています引数引数mおよび姓名を指定するます。mは,プロセッサの最小ブロック数する正の整数。。mを増やす内のレジスタ使用がし,カーネル占有占有率が改善するする可能可能ますますますmの-1の -の场合,,,,,,,ででで既定ののののををしなければならないことを。。。。姓名は,れたの名前のマイズ可能にする文字配列です。

カーネルプラグマすると,の并列并列解析のチェックがさされれますます。。このライドライドライドによりにより,すべてすべてののがが互い互いにしてないないないないことことことことことことををを并列なりますにループを化し问题がことを确认してください。

この关数コード生成ですです。matlab®では效果ありません。

すべて折りたたむ

この例で,核心プラグマをで使用し,,®コードをする方法说明します。

1つのファイルに,サイズ1x4096の2つのつの入力x,yと,,つのスカラー入力规模を受け入れるエントリ关数标量を记述。この关数は反复の长さがが异なる异なる异なるつつつ为了ループが。。つはベクトル用で,,つは累积を求めるためのループループです。最初外外ののcoder.gpu.kernel(1,1024)1024スレッドを,。。。。プラグマによりスレッドスレッドスレッドスレッドつブロックブロックが用意用意さされたカーネルカーネルが作成作成さささ2Coder.gpu.Kernel(8,512,512,“减少”)1ブロック。このプラグマによりによりにより,,,,,,ブロックブロックブロックブロックブロックブロックスレッドスレッドをををををつののブロックブロックががが用意れれたたカーネルがががが作成ささされれますますます。。。このこのブロックブロック作成作成ささされれれれれれれれ

功能[vout,sout1] =标量(x,y,scale)sout1 = 0;vout = coder.nullcopy(zeros(size(x)));coder.gpu.kernel(1,1024);为了i = 1:1024 vout(i)= x(i) + y(i);结尾coder.gpu.kernel(8,512,512,'减少');为了i = 1:4096 sout1 =(x(i)*scale) + sout1;结尾结尾

关数代码根Cuda Mex关数关数关数を生成生成し。。。

代码根-configcoder.gpuconfig('mex')...-args{一个(1,4096,'double'),一个(1,4096,'double'),coder.typeof(0)}...-报告标量

GPU编码器により2つのカーネル作成さますベクトル加算のののscalars_kernel1と,累积用の标量カーネルです。sout1 = 0に初期するにカーネル必要ありませ。。

cudamemcpy(gpu_y,y,32768u,cudamemcpyhosttodevice);cudamemcpy(gpu_x,x,32768u,cudamemcpyhosttodevice);scalars_kernel1 <<< dim3(1u,1u,1u),dim3(1024u,1u,1u,1u)>>>(gpu_y,gpu_x,gpu_x,gpu_vout);cudamemcpy(gpu_sout1,sout1,8u,cudamemcpyhosttodevice);标量<<< dim3(8u,1u,1u),dim3(512u,1u,1u,1u >>>(scal,gpu_x,gpu_sout1); cudamemcpy(vout,gpu_vout,32768U,32768u,cudamemcpydevicetohost); cudamememcpy(cudamemcpy(soutamemcpy)(soutamemcpy(soutamcpy)1,soutamcpy(sOutamcpy(soutamcpy),cudamcpydevicetohost);

scalars_kernel11ブロック11024スレッドスレッドを含むつのがされ,それぞれそれぞれ各各要素ますますますますます标量カーネルにはははあたり512スレッドスレッドを含む含むつのブロック用意用意され,合计合计合计でででは​​はははははははははははははははスレッドスレッド

カーネルのする际にまたはまたはでき。。たとえば,グリッドとブロックのの次元がコンパイルコンパイル时ににに指定指定标量エントリポイントを书き换えることができ。。

功能[vout,sout1] =标量(x,y,比例,a,b)sout1 = 0;vout = zeros(size(x));coder.gpu.kernel(1,1024);为了i = 1:1024 vout(i)= x(i) + y(i);结尾coder.gpu.kernel([[a,a*b,1],[a*b,1,1],'减少');为了i = 1:长度(x)sout1 =(x(i)*scale) + sout1;结尾结尾

关数代码根Cuda Mex关数关数关数を生成生成し。。。

代码根-configcoder.gpuconfig('mex')...-args{一个(1,4096,'double'),一个(1,4096,'double'),20,8,4}...-报告标量

バージョン履歴

R2017Bで导入