В вашем примере скорее всего достаточно распаралеллить только циклы по i.
Но, если у вас n меньше количества потоков, то можно использовать диррективу
collapse. Подробнее можете почитать в
документации (на странице 185).
Или можете расплющить 3 вложенных цикла в один руками так:
int n3 = (n-2)*(n-2)*(n-2);
for (int iteration = 0; iteration < n3; ++iteration) {
i = iteration / ((n-2)*(n-2)) + 1;
j = iteration / (n-2) % (n-2) + 1;
k = iteration % (n-2) + 1;
// тут идет содержимое трех циклов по i,j,k = 1..n-2
}
Это просто перенумерация всех троек значений. Каждую тройку индексов i,j,k можно рассматривать как трехзначное число в (N-2)-ичной системе счисления. Поэтому можно каждое число от 0 до (n-2)^3 разложить в n-2)-ичную систему счисления через / и % и получить три индекса.
Но collapse и, тем более, ручной вариант будут иметь накладные расходы на вычисление индексов. Поэтому их имеет смысл использовать только если у вас n меньше количества доступных потоков.