coder.gpu.persistentMemory

Прагма, чтобы выделить переменную как постоянную память на графическом процессоре

    Описание

    пример

    coder.gpu.persistentMemory(pvar) сопоставляет персистентную переменную pvar MATLAB® к CUDA® включил NVIDIA® графический процессор как переменную с постоянной памятью. Переменная должна быть фиксированным размером и типа данных, поддержанного для генерации кода графического процессора.

    Это - функция генерации кода. Это не оказывает влияния в MATLAB.

    Примечание

    Для MEX CUDA постоянная память на графическом процессоре сохраняется во время полноты сеанса работы с MATLAB. Для освобождения памяти графического процессора используйте clear mex Команда MATLAB. Для освобождения памяти графического процессора в статических библиотеках динамические библиотеки или исполняемые цели, вызывают сгенерированный <primary function name>_terminate() функция обслуживания.

    Примеры

    свернуть все

    В этом примере показано, как сопоставить персистентную переменную MATLAB с постоянной памятью на графическом процессоре при помощи coder.gpu.persistentMemory прагма.

    Считайте следующую функцию точки входа 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');

    Задайте массив ячеек input это объявляет размер и тип данных входных параметров к функциональному myPersistent.

    input = {rand(1,1024)}

    Сгенерируйте MEX-функцию myPersistent_mex при помощи codegen функция с -config, -args, и -report опции, чтобы задать настройку, обеспечьте входные параметры и сгенерируйте отчет генерации кода.

    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() функция.

    Входные параметры

    свернуть все

    Имя переменной, которая должна быть сопоставлена с пространством памяти графического процессора как персистентная переменная.

    Ограничения

    • Классы MATLAB не поддерживаются coder.gpu.persistentMemory прагма.

    • coder.gpu.persistentMemory прагма не поддерживается в Simulink®.

    • Если персистентная переменная в MATLAB переменного размера, генератор кода не сопоставляет переменную с постоянной памятью на графическом процессоре.

    Введенный в R2020b