exponenta event banner

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. 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