主要内容

coder.gpu.kernelfun

関数をgpuカ,ネルにマッピングするプラグマ

説明

coder.gpu.kernelfun ()は,それが配置されている関数内のすべての計算をGPUにマッピングしようとするグローバルレベルのプラグマです。この関数内のループがGPUカーネルに並列化されるのは,並列ループ解析チェックをパスした場合のみです。この解析は,すべてのル,プ反復が互いに依存していないことを証明しようとします。

このプラグマは入力パラメ,タ,を必要としません。生成されるカ,ネルの次元は,ル,プパラメ,タ,に基づいて自動的に計算されます。

この関数はコ,ド生成関数です。MATLAB®では効果がありません。

すべて折りたたむ

この例では,kernelfunプラグマを関数で使用し,cuda®コドを生成する方法にいて説明します。

1 .1 x4096の2のベクトル入力x, yと,1のスカラ规模を受け入れるエントリポ@ @ント関数标量を記述します。この関数には反復の長さが異なる2のル,プがあります。1 .。coder.gpu.kernelfun ()プラグマを関数标量内に配置します。

函数[vout, sout1] = scalars(x,y,scale) code .gpu.kernelfun;Sout1 = 0;Vout = code .nullcopy(0 (1,1024));vout(I) = x(I) + y(I);结束I =1:4096 sout1 = (x(I)*scale) + sout1;结束结束

関数codegenを使用してcuda mex関数を生成します。

codegen配置coder.gpuConfig(墨西哥人)...arg游戏{1(1, 4096,“双”)的(1,4096,“双”),coder.typeof (0)}...报告标量

GPU编码器により3のカネルが作成されます。sout1 = 0の初期化用のscalars_kernel1,ベクトル加算用のscalars_kernel2に加えて,scalars_kernel3は累積和用のリダクションカ,ネルです。

scalars_kernel1<<>>(gpu_sout1);cudaMemcpy(gpu_y, y, 32768U, cudaMemcpyHostToDevice);cudaMemcpy(gpu_x, x, 32768U, cudaMemcpyHostToDevice);scalars_kernel2<<>>(gpu_y, gpu_x, gpu_vout);scalars_kernel3<<>>(scale, gpu_x, gpu_sout1);cudaMemcpy(vout, gpu_vout, 32768U, cudaMemcpyDeviceToHost);cudaMemcpy(sout1, gpu_sout1, 8U, cudaMemcpyDeviceToHost);

scalars_kernel2には1ブロックあたり512スレッドを含む2つのブロック(合1024計スレッド)が用意され,それぞれが各要素を加算します。同様に,scalars_kernel3には1ブロックあたり512スレッドを含む8つのブロックが用意され,合計では4096スレッドになります。GPU编码器は,関数cudamMemcpyの呼び出しの数を最小化する最適化も実行します。この例では,入力xのコピがgpu内にあるため,scalars_kernel2およびscalars_kernel3の間に追加のcudamMemcpyは必要ありません。メモリ最適化に加えて,カーネル間の逐次コードはCUDAスレッドにマッピングされ,データがGPU上に維持されます。

バ,ジョン履歴

R2017bで導入