coder.loop.parallelize

Отключите автоматическое распараллеливание for цикл

    Описание

    пример

    coder.loop.parallelize('never') отключает автоматическое распараллеливание for цикл, помещенный сразу после него. Эта прагма заменяет EnableAutoParallelization параметр конфигурации.

    Эта прагма поддерживает явный for циклы только. Для получения дополнительной информации о явных и неявных циклах смотрите, Параллелизируют Неявные циклы for.

    Примеры

    свернуть все

    В этом примере показано, как отключить автоматическое распараллеливание определенного for цикл в вашем коде MATLAB® при помощи coder.loop.parallelize('never') директива.

    Задайте функцию MATLAB autoparExample:

    function [x, y] = autoparExample(x, y) %#codegen
    x = x * 17;
    % Pragma to disable automatic parallelization of for-loops
    coder.loop.parallelize('never');
    for i = 10:numel(x)
        y(i) = sqrt(y(i));
    end
    end

    Эта функция содержит два цикла:

    • mtimes (умножение матриц) функция содержит неявный for цикл, который выполняет итерации по элементам матричного x.

    • Явный for цикл, который вычисляет квадратный корень из подмножества элементов матричного y. coder.loop.parallelize('never') директива отключает автоматическое распараллеливание для этого цикла.

    Создайте объект настройки генерации кода для статической библиотеки. Установите EnableAutoParallelization свойство к true. Задайте входные типы как 1 2000, векторы-строки из удваиваются, и сгенерируйте код.

    cfg = coder.config('lib');
    cfg.EnableAutoParallelization = 1;
    codegen -config cfg autoparExample -args {rand(1,2000) rand(1,2000)} -report
    Code generation successful: View report

    Откройте отчет генерации кода и смотрите сгенерированный autoparExample функция:

    • Сгенерированный код содержит параллельный цикл для операции умножения.

    • Явный for цикл преобразован в последовательный цикл в сгенерированном коде. Этому циклу предшествовал coder.loop.parallelize('never') директива в вашем коде MATLAB. Так, генератор кода не параллелизировал его.

    void autoparExample(double x[2000], double y[2000])
    {
      int b_i;
      int i;
      if (!isInitialized_autoparExample) {
        autoparExample_initialize();
      }
    #pragma omp parallel for num_threads(omp_get_max_threads()) private(i)
    
      for (i = 0; i < 2000; i++) {
        x[i] *= 17.0;
      }
      /*  Pragma to disable automatic parallelization of for-loops */
      for (b_i = 0; b_i < 1991; b_i++) {
        y[b_i + 9] = sqrt(y[b_i + 9]);
      }
    }
    Введенный в R2021a