A for
цикл подходит для параллелизации, если различные итерации цикла могут выполняться независимо друг от друга, не влияя на конечный ответ. Если одна итерация for
цикл обращается к данным, записанным в другой итерации, итерации не могут выполняться независимо, и цикл не может быть преобразован в параллельный цикл. Предположим, что ваш MATLAB® код содержит такой цикл, и вы устанавливаете параметры конфигурации EnableAutoParallelization
и EnableAutoParallelizationReporting
на true
при генерации кода. В таких ситуациях генератор кода может выдать это сообщение на вкладке Code Insights приложения 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