这是我的代码:
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 个 CPU 内核。将我的阵列分布在这些核心上的最佳方式是什么?数组的长度是灵活的(我可以以某种方式将它与 CPU 的数量相匹配)。
有什么建议么?