coder.loop.parallelize

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

    Описание

    пример

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

    Эта прагма поддерживает явные 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. The 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