2016-10-21 1 views
2

я проверял кто-то 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]; 
    } 

Мой вопрос заключается в том, можно ли свернуть все три петли? Я имею в виду, что я пытаюсь понять логику разработчика (он должен быть очень опытным) - почему он этого не сделал?

+1

Мотивация для свертывания внешних контуров состоит в том, чтобы распределить работу более равномерно по нитям. Включение внутреннего цикла в коллапс будет мешать векторизации, вероятно, предотвращая его, если вы не установите simd и не используйте подходящий компилятор. – tim18

+1

Принятый ответ неправильный! –

+2

Хорошо, в случае, если эти ответы остаются запутанными, коллапс (2) объединяет 2 внешних цикла и оставляет внутреннюю петлю в соответствии с настройками компилятора, такими как авто-векторизация. Вероятно, это хороший выбор. – tim18

ответ

3

Вы могли бы это сделать, но какую выгоду он принесет?

Предполагает, что nxn * nyn значительно больше OMP_NUM_THREADS. Таким образом, уже есть итерации цикла, которые эффективно распараллеливаются.

С другой стороны, внутренний контур имеет высокую локальность данных. Хотя OpenMP, вероятно, сохранит это, может быть определенная оптимизация, что последнее измерение массивов является кратным строкам кэша, поэтому было бы неразумно разделять их между потоками. Как отмечалось в tim18, возможная интерференция с векторизации внутреннего цикла может стать еще одной проблемой при свертывании всех циклов.

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

 Смежные вопросы

  • Нет связанных вопросов^_^