【问题标题】:Not able to automatically parallelize for loop with numba无法使用 numba 自动并行化 for 循环
【发布时间】:2018-04-17 07:42:21
【问题描述】:

我正在尝试在多个内核上运行以下命令以加快使用 numba 的速度。不幸的是,当我测试它时,该功能似乎只在一个核心上运行。有人可以向我解释为什么以及是否有可能让它在多个内核上运行?

最小的工作示例:

import numpy as np
import numba

a = np.random.rand(100000)

@numba.jit(nopython=True, parallel=True)
def func(x):
    result = np.zeros_like(x)
    for delta in range(1,len(x)):
        thisresult = 0
        for i in range(delta,len(x)):
            thisresult += (x[i] - x[i-delta])**2
        result[delta] = thisresult / (len(x) - delta)
    return result

print(func(a))

【问题讨论】:

    标签: python parallel-processing numba


    【解决方案1】:

    显式并行化

    我总是建议明确地并行化代码。 Numba 尝试序列化一些并行代码部分,但这并不总是有效或导致最佳性能。

    import numpy as np
    import numba 
    
    a = np.random.rand(100000)
    
    @numba.jit(nopython=True, parallel=True)
    def func(x):
        result = np.zeros_like(x,dtype=x.dtype)
        for delta in numba.prange(1,len(x)):
            thisresult = 0
            for i in range(delta,len(x)):
                thisresult += (x[i] - x[i-delta])**2
            result[delta] = thisresult / (len(x) - delta)
        return result
    
    print(func(a)) 
    

    更多详情请查看documentation

    【讨论】:

    • 我想我也可以将第二个range 更改为numba.prange
    • 这实际上会慢一些。但是可以重写外部 for 循环以获得一些性能(计算时间随着增量的增加而减少)。
    猜你喜欢
    • 2021-08-15
    • 2018-04-06
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多