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