Решите вопрос: массив или переменная схема доступа, не подходящая для параллельного выполнения

Проблема

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.

Если цикл параллелизируется, такой порядок доступа к памяти не, сохраняются, потому что каждая итерация может потенциально быть выполнена параллельно. Так, генератор кода автоматически не параллелизирует этот цикл.

Чтобы решить эту проблему, попытайтесь переписать свой код, чтобы избежать таких шаблонов доступа к массиву.

Смотрите также

| | |

Похожие темы