【问题标题】:Parallelizing generation of random vectors with arbitrary length using numba使用 numba 并行生成任意长度的随机向量
【发布时间】:2019-09-16 22:08:46
【问题描述】:

我想生成如下形式的随机向量

[ i if random.uniform(0,1) <= probs[i] for i prange(K) ]

对于K 长度的概率数组probs。每个结果向量都有介于 0 和 K 之间的元素。从概念上讲,这就像翻转K 特定硬币(具有特定正面的概率)并记录哪些硬币显示正面。

任意返回长度使得难以使用numba 中的任何自动并行化选项。例如,

from numba import prange, njit, int64, float64
import numpy as np

@njit([int64[:](float64[:], int64)])
def rand_coin(freqs,r):
    return np.arange(r)[np.random.uniform(0,1,size=r)<=freqs] 

@njit(parallel=True)
def rand_coins(freqs,n):
    r = freqs.shape[0]
    return [rand_coin(freqs,r) for i in range(n)] #                     **

r = 10; n =100
freqs = np.random.uniform(0,1,r)
rand_coins(freqs, n) 

连续工作很好,但如果将星号行中的range 替换为prange,则会产生double free or corruption 错误。

是否可以并行化在numba 中返回随机长度数组的函数?

【问题讨论】:

    标签: python numpy parallel-processing numba


    【解决方案1】:

    prange 是一个 numba 函数。输入错误只是 numba 的一般错误,表示它在编译函数时遇到了问题。真正的问题是您正在尝试调用未声明的函数。您需要像这样使用prange 函数:

    from numba import njit, int64, float64
    import numba
    import numpy as np
    
    @njit([int64[:](float64[:], int64)])
    def rand_coin(freqs,r):
        return np.arange(r)[np.random.uniform(0,1,size=r)<=freqs] 
    
    @njit(parallel=True)
    def rand_coins(freqs,n):
        r = freqs.shape[0]
        return [rand_coin(freqs,r) for i in numba.prange(n)] #                     **
    

    【讨论】:

    • 这只是我上面例子中的错字。运行你的代码会产生一个double free or corruption 错误(在运行时上面的玩具示例)——它对你有用吗?
    • 它适用于be,但我怀疑它与列表理解有关。我在谷歌上查了一下,发现了这个 github 问题:github.com/numba/numba/issues/3634。当您使用这样的理解时,prange 似乎是必要的。
    • 顺便说一句:rand_coins.parallel_diagnostics(level = 4) 是否使用 np.random.*() 确认并行部分“周围”,其中 strict-re-[SERIAL]-isation 是必须,由于同时维护状态机 .seed 和伪随机生成序列的可重复性?
    • @user3666197 当我执行上面的rand_coins 函数时,我立即得到一个双重释放或损坏错误,然后是一个SIGABRT,所以我无法检查并行诊断——很可能与两者之一有关我在github.com/numba/numba/issues/4569 所做的报告
    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 2017-11-19
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多