gpucoder.atomicExch

Атомарно обменивайтесь переменной в глобальной памяти или общей памяти с заданным значением

    Описание

    пример

    [A,oldA] = gpucoder.atomicExch(A,B) атомарно обменивается значением A в глобальной памяти или общей памяти со значением в B и записывает результат обратно в A. Операция является атомарной в некотором смысле, что целая операция "чтение изменяет запись", как, гарантируют, будет выполнен без интерференции от других потоков. Порядок аргументов ввода и вывода должен совпадать с обеспеченным синтаксисом.

    Примеры

    свернуть все

    Выполните простую атомарную валютную операцию при помощи gpucoder.atomicExch функционируйте и сгенерируйте CUDA® код, который вызывает соответствующий atomicExch() CUDA API.

    В одном файле запишите функции точки входа myAtomicExch это признает, что матрица вводит a и b.

    function a = myAtomicExch(a,b)
    
    coder.gpu.kernelfun;
    for i =1:numel(a)
        [a(i),~] = gpucoder.atomicExch(a(i), b);
    end
    
    end
    

    Создать тип для матрицы удваивается для использования в генерации кода, используйте coder.newtype функция.

    A = coder.newtype('single', [1 30], [0 1]);
    B = coder.newtype('single', [1 1], [0 0]);
    inputArgs = {A,B};
    

    Чтобы сгенерировать библиотеку CUDA, используйте codegen функция.

    cfg = coder.gpuConfig('lib');
    cfg.GenerateReport = true;
    
    codegen -config cfg -args inputArgs myAtomicExch -d myAtomicExch
    

    Сгенерированный код CUDA содержит myAtomicExch_kernel1 ядро с вызовами atomicExch() API CUDA.

    //
    // File: myAtomicExch.cu
    //
    ...
    
    static __global__ __launch_bounds__(1024, 1) void myAtomicExch_kernel1(
        const real32_T b, const int32_T i, real32_T a_data[])
    {
      uint64_T loopEnd;
      uint64_T threadId;
    ...
    
      for (uint64_T idx{threadId}; idx <= loopEnd; idx += threadStride) {
        int32_T b_i;
        b_i = static_cast<int32_T>(idx);
        atomicExch(&a_data[b_i], b);
      }
    }
    ...
    
    void myAtomicExch(real32_T a_data[], int32_T a_size[2], real32_T b)
    {
      dim3 block;
      dim3 grid;
    ...
    {
        cudaMemcpy(gpu_a_data, a_data, a_size[1] * sizeof(real32_T),
                   cudaMemcpyHostToDevice);
        myAtomicExch_kernel1<<<grid, block>>>(b, i, gpu_a_data);
        cudaMemcpy(a_data, gpu_a_data, a_size[1] * sizeof(real32_T),
                   cudaMemcpyDeviceToHost);
    ...
    
    }

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

    свернуть все

    Операнды в виде скаляров, векторов, матриц или многомерных массивов. Входные параметры A и B должен удовлетворить следующим требованиям:

    • Имейте совпадающий тип данных.

    • Имейте тот же размер или имейте размеры, которые совместимы. Например, A M- N матрица и B скаляр или 1- N вектор-строка.

    Типы данных: single | int32 | uint32 | uint64

    Ограничения

    • Вход указателя на функцию к gpucoder.stencilKernel прагма не может содержать вызовы атомарных функций. Например,

      out1 = gpucoder.stencilKernel(@myAtomicExch,A,[3 3],'same',B);
      

    Введенный в R2021b
    Для просмотра документации необходимо авторизоваться на сайте