A for цикл подходит для распараллеливания, если различные итерации цикла могут выполняться независимо друг от друга без влияния на окончательный ответ. Если одна итерация for цикл обращается к данным, записанным в другой итерации, итерации не могут быть выполнены независимо и цикл не может быть преобразован в параллельный цикл. Предположим, что код MATLAB ® содержит такой цикл и задаются параметры конфигурации.EnableAutoParallelization и EnableAutoParallelizationReporting кому true при формировании кода. В таких ситуациях генератор кода может создать следующее сообщение на вкладке Анализ кода приложения MATLAB Coder™ или отчет о создании кода:
Array or variable access pattern inside the loop is not suitable for parallel execution.
Это сообщение с информацией о коде может быть инициировано либо скалярным шаблоном доступа, либо шаблоном доступа к массиву, который вызывает итерацию for для зависимости от другой итерации.
Предположим, что код MATLAB содержит цикл с постоянным скаляром. Это пример такого цикла:
for i = 1:numel(x) r = sqrt(y(i)) / x(i) * i; y(i) = x(i) - r; end
Переменная r является постоянным в итерациях цикла и предотвращает параллелизацию.
Устраните постоянный скаляр. Удаление постоянного скаляра r позволяет выполнять итерации цикла независимо. Таким образом, последовательный цикл может быть преобразован в параллельный цикл.
for i = 1:numel(x) y(i) = x(i) - (sqrt(y(i)) / x(i) * i); end
Преобразование постоянного скаляра в вектор. Преобразование постоянного скаляра r к вектору r(i) позволяет выполнять итерации цикла независимо. Таким образом, последовательный цикл может быть преобразован в параллельный цикл.
for i = 1:numel(x) r(i) = sqrt(y(i)) / x(i) * i; y(i) = x(i) - r(i); end
Предположим, что код MATLAB содержит цикл, одна итерация которого обращается к данным, записанным в другой итерации. Это пример такого цикла:
for i = 2:n a(i) = a(i+1) b(i) = b(i-1) end
Местоположение a(i) записывается в текущую итерацию i был прочитан в предыдущей итерации i-1.
Местоположение b(i) записывается в текущую итерацию i будет прочитано в следующей итерации i+1.
Если цикл является параллельным, такой порядок доступа к памяти не сохраняется, поскольку каждая итерация потенциально может выполняться параллельно. Таким образом, генератор кода не автоматически распараллеливает этот цикл.
Чтобы устранить эту проблему, попробуйте переписать код, чтобы избежать таких шаблонов доступа к массиву.
coder.CodeConfig | coder.config | coder.EmbeddedCodeConfig | coder.MexCodeConfig