Parallel processing 并行计算-洗牌

Parallel processing 并行计算-洗牌,parallel-processing,shuffle,Parallel Processing,Shuffle,我希望并行洗牌一个数组。我发现,使用类似于双音排序的算法,但使用随机(50/50)重新排序,结果是相等的分布,但前提是数组的幂为2。我考虑过耶茨·费舍尔洗牌,但我不知道如何将其并行化以避免O(N)计算 有什么建议吗 谢谢 最近有一篇关于这一点的清晰的论文,参考文献,特别是Sun等人2015值得一读 但基本上,您可以使用与sort-R中使用的方法相同的方法来实现这一点:通过给每行一个随机键值并对该键值进行排序来进行无序排列。有很多方法可以很好地实现并行分布式排序 这里是python+MPI的基本版

我希望并行洗牌一个数组。我发现,使用类似于双音排序的算法,但使用随机(50/50)重新排序,结果是相等的分布,但前提是数组的幂为2。我考虑过耶茨·费舍尔洗牌,但我不知道如何将其并行化以避免O(N)计算

有什么建议吗


谢谢

最近有一篇关于这一点的清晰的论文,参考文献,特别是Sun等人2015值得一读

但基本上,您可以使用与
sort-R
中使用的方法相同的方法来实现这一点:通过给每行一个随机键值并对该键值进行排序来进行无序排列。有很多方法可以很好地实现并行分布式排序

这里是python+MPI的基本版本,使用奇偶排序;如果P是处理器的数量,它将通过P个通信步骤。你可以做得更好,但这很容易理解;这在第二章讨论

from\uuuuu future\uuuuu导入打印功能
导入系统
随机输入
从mpi4py导入MPI
comm=MPI.comm_WORLD
def交换(本地数据、sendrank、recvrank):
"""
与邻居进行合并交换;
sendrank向recvrank发送本地数据,
哪个合并对其排序,然后发送较低的
数据返回到排名较低的流程和
保留上层数据
"""
秩=通信获取秩()
断言秩==sendrank或秩==recvrank
断言sendrank0:
数据=交换(数据,秩-1,秩)
返回数据
def main():
#每个人都有自己的数据
秩=通信获取秩()
nprocs=通信获取大小()
n_每_过程=5
数据=列表(范围(n_/proc*排名,n_/proc*(排名+1)))
如果秩==0:
打印(“原件:”)
按排名打印(数据、排名、NPROC)
#用随机值标记数据
数据=[(random.random(),item)用于数据中的项]
#现在按这些随机标记对其进行排序
数据=奇偶排序(数据)
如果秩==0:
打印(“无序:)
按排名打印排名([x代表排名,数据中的x]、排名、NPROC)
返回0
如果名称=“\uuuuu main\uuuuuuuu”:
sys.exit(main())
跑步可以带来:

$ mpirun -np 5 python mergesort_shuffle.py
Original:
0: [0, 1, 2, 3, 4]
1: [5, 6, 7, 8, 9]
2: [10, 11, 12, 13, 14]
3: [15, 16, 17, 18, 19]
4: [20, 21, 22, 23, 24]

Shuffled:
0: [19, 17, 4, 20, 9]
1: [23, 12, 3, 2, 8]
2: [14, 6, 13, 15, 1]
3: [11, 0, 22, 16, 18]
4: [5, 10, 21, 7, 24]