Это мой код:
double res1[NNN];
#pragma omp parallel for collapse(3) schedule(dynamic)
for (int i=0; i<NNN; i++)
{
for (int j=0;j<NNN;j++)
{
for (int k=0;k<NNN;k++)
{
res1[i] = log(fabs(i*j*k));
}
}
}
std::cout<< res1[10] << std::endl;
Когда я использую collapse(3)
, требуется ~ 50 секунд; без collapse(3)
всего ~ 6-7 секунд. Я очень озадачен этим поведением, так как я ожидал бы лучшей производительности с "крахом", чем без.
Я что-то пропустил?
Я провел несколько экспериментов и играл с разными конфигурациями:
(NNN = 2500 и 24 ядра)
-
schedule(STATIC)
&& &collapse(3)
→ ~ 54 сек -
schedule(STATIC)
&& &collapse(2)
→ ~ 8 сек -
schedule(STATIC)
&& &collapse(1)
→ ~ 8 сек
Я также пробовал с расписанием DYNAMIC
, но это занимает огромное время (несколько минут).
В моей исходной проблеме у меня есть 4 DIM-for-loops (4D-массив): 51x23x51x23.
Каков наилучший способ использования OpenMP/MPI для минимизации времени работы? Я имею в общей сложности ~ 300 процессорных ядер. Каков наилучший способ распространения моего массива по этим ядрам? Длина массива является гибкой (я могу каким-то образом сопоставить ее с количеством процессоров).
Любые предложения?