在圣人中并行化素生成

时间:2014-02-27 18:40:39

标签: parallel-processing sage

由于ask.sagemath.org失效,我想我会在这里问这个......

我正在尝试使用sage中的random_prime函数并行生成一堆随机素数。这是一些代码:

#!/usr/bin/env sage -python
from __future__ import print_function
from sage.all import *
import time

N = 100
B = 200
length = (1 << B) - 1

print('Generating primes (sequentially)')
start = time.time()
ps = []
for _ in xrange(N):
    ps.append(random_prime(length))
end = time.time()
print('Took: %f seconds' % (end - start))
print(ps)

@parallel(ncpus=10)
def _random_prime(length):
    return random_prime(length)

print('Generating primes (in parallel)')
start = time.time()
ps = [length] * N
ps = list(_random_prime(ps))
end = time.time()
print('Took: %f seconds' % (end - start))
ps = [p for _, p in ps]
print(ps)

第一次运行按顺序计算质数,它可以工作。

第二次运行使用sage的@parallel装饰器计算它们。它在计算并行化的意义上“起作用”,但所有输出素数都是相同的(即,它不产生100个随机素数,而是产生100个相同随机素数的实例)。我认为这是@parallel的常见用例,但我找不到有关此问题的详细信息。有人有主意吗?感谢。

1 个答案:

答案 0 :(得分:1)

只是暗示一下 - 你是否有可能每次都要设置不同的种子?请注意,the doc在测试中没有#random,因此所有并行实例的种子可能由于某种原因而相同(这似乎是合理的)。

编辑以将Volker的更详细描述如何执行此操作:

import os
import sage.misc.randstate as randstate
randstate.set_random_seed(os.getpid())