exponenta event banner

coder.gpu.persistentMemory

Pragma для выделения переменной в качестве постоянной памяти на GPU

    Описание

    пример

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

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

    Примечание

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

    Примеры

    свернуть все

    В этом примере показано, как сопоставить постоянную переменную MATLAB с постоянной памятью на GPU с помощью 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 сохраняется на GPU между вызовами myPersistent() функция.

    Входные аргументы

    свернуть все

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

    Ограничения

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

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

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

    Представлен в R2020b