coder.gpu.persistentMemory

Прагма для выделения переменной в качестве постоянной памяти на графическом процессоре

    Описание

    пример

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

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

    Примечание

    Для CUDA MEX постоянная память на графическом процессоре сохраняется в течение всего сеанса работы с 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 прагма.

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

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

    Введенный в R2020b