coder.loop.parallelize - Parallelize specific for loops in generated code; disable

  automatic parallelization - MATLAB ([original](http://www.mathworks.com/access/helpdesk/help/coder/ref/coder.loop.parallelize.html)) ([raw](?raw))

Main Content

Parallelize specific for loops in generated code; disable automatic parallelization

Since R2021a

Syntax

Description

coder.loop.parallelize('never') disables automatic parallelization of the for loop placed immediately after it. This pragma overrides theEnableAutoParallelization configuration setting.

This pragma supports explicit for loops only. For more information on explicit and implicit loops, see Parallelization of Explicit and Implicit for-loops.

example

coder.loop.parallelize("[loopID](#mw%5F579ac115-bc32-4ec5-b3b6-1424ddc395a8)") parallelizes the for-loop whose index name is loopID.

This prompts the generated code for that loop to execute the iterations in parallel with the threads available for your target. This transforms requiresEnableOpenMP to be set to true in your code configuration object.

For more information about loop optimizations, see Optimize Loops in Generated Code.

[loopObj](#mw%5F26ffd9e6-87b4-4431-8ff2-a99334a60453) = coder.loop.parallelize(___) creates a loop control object with transformSchedule property set tocoder.loop.parallelize. Use the apply method to apply the transform to the specified loop.

Examples

collapse all

This example shows how to disable the automatic parallelization of a specific for loop in your MATLABĀ® code by using the coder.loop.parallelize('never') directive.

Define the MATLAB function 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

This function contains two loops:

Create a code generation configuration object for a static library. Set theEnableAutoParallelization property to true. Specify the input types as 1-by-2000 row vectors of doubles and generate code.

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

Code generation successful: View report

Open the code generation report and inspect the generatedautoparExample function:

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]); } }

You can choose to parallelize specific for-loops in the generated code by using the coder.loop.parallelize function in your MATLAB code.

Define a MATLAB function forLoopFuncParallel. Within the function, call coder.loop.parallelize with the for-loop index to be parallelized. Also call the function to prevent parallelization of a specific loop.

function [out1,out2] = forLoopFuncParallel out1 = ones(1,100); out2 = zeros(1,100);

coder.loop.parallelize("i"); for i = 1:100 out1(i) = out1(i) * i; end

coder.loop.parallelize("j","never"); for j = 1:100 out2(j) = out2(j) + j; end

Generate code for this function at the command line.

codegen forLoopFuncParallel -config:lib

Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because Embedded Coder is not installed, this might cause some Embedded Coder features to fail.

Code generation successful (with warnings): View report

Inspect the generated code. The code generator uses OpenMP to parallelize the loop.

type(fullfile("codegen","lib","forLoopFuncParallel","forLoopFuncParallel.c"))

/*

/* Include Files */ #include "forLoopFuncParallel.h" #include "forLoopFuncParallel_data.h" #include "forLoopFuncParallel_initialize.h" #include "omp.h" #include <emmintrin.h>

/* Function Definitions / /

#pragma omp parallel for num_threads(omp_get_max_threads())

for (i = 0; i < 100; i++) { out1[i] *= (double)i + 1.0; } for (j = 0; j <= 98; j += 2) { __m128d r; __m128d r1; dv[0] = j; dv[1] = (double)j + 1.0; r = _mm_loadu_pd(&dv[0]); r1 = _mm_loadu_pd(&out2[j]); _mm_storeu_pd(&out2[j], _mm_add_pd(r1, _mm_add_pd(r, _mm_set1_pd(1.0)))); } }

/*

Input Arguments

collapse all

for loop identifier or index name to parallelize, specified as a character vector a string scalar.

Data Types: char | string

Output Arguments

collapse all

Loop control object with transformSchedule property set tocoder.loop.parallelize.

Extended Capabilities

Version History

Introduced in R2021a