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

Проблема

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.

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

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

См. также

| | |

Похожие темы