可能使用numba.guvectorize公司为了模拟ALL/prange的并行性?

2024-09-28 22:34:45 发布

您现在位置:Python中文网/ 问答频道 /正文

作为一个数据分析和数值计算的Python用户,而不是一个真正的“编码器”,我一直缺少一种非常低开销的方法,即在几个核心上分配令人尴尬的并行循环计算。 据我所知,Numba中曾经有prange结构,但它是abandoned because of "instability and performance issues"。在

通过使用newly open-sourced@guvectorize装饰器,我发现了一种方法,可以使用它来实现几乎不需要对late prange功能的开销模拟。在

感谢Continuum Analytics的同事们,我很高兴现在有了这个工具,而且在web上没有发现任何明确提到使用@guvectorize的东西。尽管这对那些之前使用过NumbaPro的人来说可能是微不足道的,但我将把这个贴给所有其他非编码人员(参见我对这个“问题”的回答)。在


Tags: andof方法用户核心performance编码器结构
1条回答
网友
1楼 · 发布于 2024-09-28 22:34:45

考虑下面的例子,在这个例子中,一个两层嵌套的for循环,一个核心执行一些涉及两个输入数组的数值计算,循环索引函数以四种不同的方式执行。每个变量都使用Ipython的%timeit魔术计时:

  1. naivefor循环,编译时使用麻木.jit在
  2. 类构造使用numba.guvectorize公司,在单个线程中执行(target = "cpu"
  3. 类构造使用numba.guvectorize公司,在cpu“核心”(在我的例子中是超线程)的线程中执行(target = "parallel"
  4. 与3相同,但是称之为“guvectorized”forall,其顺序是“并行”循环索引随机排列

最后一个是因为(在这个特定的例子中)内循环的范围取决于外循环的索引值。我不知道gufunc调用的分派在numpy中是如何组织的,但似乎“并行”循环索引的随机化实现了稍微更好的负载平衡。在

在我的(慢)机器上(第一代核心i5,2核,4个超线程),我得到了时间安排:

1 loop, best of 3: 8.19 s per loop
1 loop, best of 3: 8.27 s per loop
1 loop, best of 3: 4.6 s per loop
1 loop, best of 3: 3.46 s per loop

注意:如果这个方法很容易应用到target=“gpu”(应该可以,但是我现在没有合适的显卡),那么加速是什么呢。请发帖!在

下面是一个例子:

^{pr2}$

相关问题 更多 >