я проверял кто-то OpenMP код и увидел эти три вложенным для лупов, где только (первая?) Два из них были свернутые:Сворачивание два для петель из трех в OpenMP
#pragma omp for collapse(2)
for(int i=0;i<nxn;i++)
for(int j=0;j<nyn;j++)
for(int k=0;k<nzn;k++)
{
rhons[is][i][j][k] += invVOL*moments[i][j][k][0];
Jxs [is][i][j][k] += invVOL*moments[i][j][k][1];
Jys [is][i][j][k] += invVOL*moments[i][j][k][2];
Jzs [is][i][j][k] += invVOL*moments[i][j][k][3];
pXXsn[is][i][j][k] += invVOL*moments[i][j][k][4];
pXYsn[is][i][j][k] += invVOL*moments[i][j][k][5];
pXZsn[is][i][j][k] += invVOL*moments[i][j][k][6];
pYYsn[is][i][j][k] += invVOL*moments[i][j][k][7];
pYZsn[is][i][j][k] += invVOL*moments[i][j][k][8];
pZZsn[is][i][j][k] += invVOL*moments[i][j][k][9];
}
Мой вопрос заключается в том, можно ли свернуть все три петли? Я имею в виду, что я пытаюсь понять логику разработчика (он должен быть очень опытным) - почему он этого не сделал?
Мотивация для свертывания внешних контуров состоит в том, чтобы распределить работу более равномерно по нитям. Включение внутреннего цикла в коллапс будет мешать векторизации, вероятно, предотвращая его, если вы не установите simd и не используйте подходящий компилятор. – tim18
Принятый ответ неправильный! –
Хорошо, в случае, если эти ответы остаются запутанными, коллапс (2) объединяет 2 внешних цикла и оставляет внутреннюю петлю в соответствии с настройками компилятора, такими как авто-векторизация. Вероятно, это хороший выбор. – tim18