我面临一个巨大的挑战,无法证明使用英特尔MPI库的代码的以下快照的性能
double time=0
time = time - MPI_Wtime();
MPI_Win_lock(MPI_LOCK_EXCLUSIVE,0,0,win_global_scheduling_step);
MPI_Win_unlock(0,win_global_scheduling_step);
time= time + MPI_Wtime();
if(id==0)
sleep(10);
printf("%d sync time %f\n", id, time);
输出取决于0睡眠的等级。
如下所示
0同步时间0.000305
1个同步时间10.00045
2同步时间10.00015
如果我将等级0的睡眠时间改为5秒而不是10秒,那么其他等级的同步时间将与5秒相同
与窗口“win_global_step”相关联的实际数据归等级0
所有关于代码的任何讨论或想法都会非常有用
答案 0 :(得分:1)
如果排名0拥有win_global_step,并且排名0在计算内核上进入休眠或曲目,或者不进行MPI调用,则许多MPI实现将无法为其他请求提供服务。
您可以尝试设置环境变量(MPICH_ASYNC_PROGRESS
)。它引入了一些重要的性能权衡,但在某些情况下,它可以让RMA操作在没有显式调用MPI例程的情况下取得进展。
尽管有名字" MPICH"在环境变量中,它可能适用于您,因为英特尔MPI基于MPICH实现。