Main Content

coder.gpu.persistentMemory

変数を GPU の永続メモリとして割り当てるためのプラグマ

R2020b 以降

    説明

    coder.gpu.persistentMemory(pvar) は永続 MATLAB® 変数 pvar を CUDA® 対応 NVIDIA® GPU に永続メモリの変数としてマッピングします。変数は固定サイズで、GPU コード生成でサポートされるデータ型でなければなりません。

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

    メモ

    CUDA MEX では、GPU の永続メモリは MATLAB セッション全体にわたって維持されます。GPU メモリを解放するには、clear mex MATLAB コマンドを使用します。スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ターゲットの GPU メモリを解放するには、生成された <primary function name>_terminate() ハウスキーピング関数を呼び出します。

    すべて折りたたむ

    この例では、coder.gpu.persistentMemory プラグマを使用して永続 MATLAB 変数を GPU の永続メモリにマッピングする方法を示します。

    単純なループが含まれる次の MATLAB エントリポイント関数 myPersistent について考えます。

    function output = myPersistent(input)
    
        persistent pvar;
        if isempty(pvar)
            pvar = ones(size(input));
        end
        
        coder.gpu.persistentMemory(pvar);
        
        for i = 1:numel(input)
            pvar(i) = pvar(i) + input(i);
        end
        
        output = coder.nullcopy(input);
        for i = 1:numel(input)
            output(i) = pvar(i) * input(i);
        end
    end

    スタンドアロン CUDA スタティック ライブラリ用のコード生成構成オブジェクトを作成します。

    cfg = coder.gpuConfig('lib');

    関数 myPersistent の入力のサイズとデータ型を宣言する cell 配列 input を定義します。

    input = {rand(1,1024)}

    構成の指定、入力引数の指定、およびコード生成レポートの生成を行うために関数 codegen-config-args、および -report オプションを使用して、MEX 関数 myPersistent_mex を生成します。

    codegen -config cfg -args input -report myPersistent

    生成された myPersistent.cu ファイルのスニペットが表示されます。

    //
    // File: myPersistent.cu
    //
    // GPU Coder version                    : 2.0
    // CUDA/C/C++ source code generated on  : 16-Jul-2020 20:08:46
    //
    
    // Include Files
    #include "myPersistent.h"
    #include "myPersistent_data.h"
    #include "myPersistent_initialize.h"
    #include "MWCudaDimUtility.hpp"
    ...
    //
    // Arguments    : const double input[1024]
    //                double output[1024]
    // Return Type  : void
    //
    void myPersistent(const double input[1024], double output[1024])
    {
      double (*gpu_input)[1024];
      double (*gpu_output)[1024];
      if (!isInitialized_myPersistent) {
        myPersistent_initialize();
      }
    
      cudaMalloc(&gpu_output, 8192UL);
      cudaMalloc(&gpu_input, 8192UL);
      cudaMemcpy(gpu_input, (void *)&input[0], 8192UL, cudaMemcpyHostToDevice);
      myPersistent_kernel1<<<dim3(2U, 1U, 1U), dim3(512U, 1U, 1U)>>>(*gpu_input,
        *gpu_output, *pvar);
      cudaMemcpy(&output[0], gpu_output, 8192UL, cudaMemcpyDeviceToHost);
      cudaFree(*gpu_input);
      cudaFree(*gpu_output);
    }
    
    //
    // Arguments    : void
    // Return Type  : void
    //
    void myPersistent_init()
    {
      double b_pvar[1024];
      boolean_T pvar_dirtyOnCpu;
      boolean_T pvar_dirtyOnGpu;
      pvar_dirtyOnCpu = false;
      pvar_dirtyOnGpu = true;
      for (int i = 0; i < 1024; i++) {
        if (pvar_dirtyOnGpu) {
          cudaMemcpy(&b_pvar[0], pvar, 8192UL, cudaMemcpyDeviceToHost);
          pvar_dirtyOnGpu = false;
        }
    
        b_pvar[i] = 1.0;
        pvar_dirtyOnCpu = true;
      }
    
      if (pvar_dirtyOnCpu) {
        cudaMemcpy(pvar, &b_pvar[0], 8192UL, cudaMemcpyHostToDevice);
      }
    }
    ...

    永続変数 pvar は、関数 myPersistent() への複数の呼び出し間で GPU で維持されます。

    入力引数

    すべて折りたたむ

    GPU メモリ領域に永続変数としてマッピングされなければならない変数の名前。

    制限

    • MATLAB クラスは coder.gpu.persistentMemory プラグマではサポートされていません。

    • coder.gpu.persistentMemory プラグマは Simulink® ではサポートされていません。

    • MATLAB の永続変数が可変サイズである場合、コード ジェネレーターはその変数を GPU の永続メモリにマッピングしません。

    バージョン履歴

    R2020b で導入