Tag: 锁定

x86上交换与比较和交换锁的相对性能

两种常见的锁定习语是: if (!atomic_swap(lockaddr, 1)) /* got the lock */ 和: if (!atomic_compare_and_swap(lockaddr, 0, val)) /* got the lock */ 其中val可以简单地为锁的新预期所有者的常量或标识符。 我想知道的是x86(和x86_64)机器上两者之间是否存在任何显着的性能差异。 我知道这是一个相当广泛的问题,因为单个cpu模型之间的答案可能差异很大,但这是我要求的原因之一,而不仅仅是我可以访问的几个cpus的基准测试。

带有C的MPI:被动RMA同步

因为到目前为止我没有找到我的问题的答案,并且我对这个问题感到疯狂,我只是问这个问题折磨我的想法;-) 我正在研究已经编程的节点消除算法的并行化。 目标环境是一个集群。 在我的并行程序中,我区分主进程(在我的情况下为0级)和工作从属(除了0之外的每个等级)。 我的想法是,主人正在跟踪哪些奴隶可用并发送然后工作。 因此,出于某些其他原因,我尝试建立一个基于具有锁定 – 放置 – 解锁序列的被动RMA的工作流程。 我使用一个名为schedule的整数数组,其中表示等级的数组中的每个位置对于工作进程为0或对于可用进程为1(因此如果schedule [1] = 1则可用于工作)。 如果一个进程完成了它的工作,它将主数据放入1,表示它的可用性。 我试过的代码如下: MPI_Win_lock(MPI_LOCK_EXCLUSIVE,0,0,win); // a exclusive window is locked on process 0 printf(“Process %d:\t exclusive lock on process 0 started\n”,myrank); MPI_Put(&schedule[myrank],1,MPI_INT,0,0,1,MPI_INT,win); // the line myrank of schedule is put into process 0 printf(“Process %d:\t put operation called\n”,myrank); MPI_Win_unlock(0,win); // the window […]