python使用jit没加速_python – numba – guvectorize几乎不比jit快

我正在尝试并行化一个运行在许多独立数据集上的蒙特卡罗模拟.我发现numba的并行执行是几乎比numba jit实现快了30-40%.

我在Stackoverflow中找到了这些(1,2)可比较的主题,但他们并没有真正回答我的问题.在第一种情况下,实现由于回到对象模式而减慢,在第二种情况下,原始海报没有正确使用guvectorize – 这些问题都不适用于我的代码.

为了确保我的代码没有问题,我创建了这个非常简单的代码来比较jit到guvectorize:

import timeit

import numpy as np

from numba import jit, guvectorize

#both functions take an (m x n) array as input, compute the row sum, and return the row sums in a (m x 1) array

@guvectorize(["void(float64[:], float64[:])"], "(n) -> ()", target="parallel", nopython=True)

def row_sum_gu(input, output) :

output[0] = np.sum(input)

@jit(nopython=True)

def row_sum_jit(input_array, output_array) :

m, n = input_array.shape

for i in range(m) :

output_array[i] = np.sum(input_array[i,:])

rows = int(64) #broadcasting (= supposed parallellization) dimension for guvectorize

columns = int(1e6)

input_array = np.ones((rows, columns))

output_array = np.zeros((rows))

output_array2 = np.zeros((rows))

#the first run includes the compile time

row_sum_jit(input_array, output_array)

row_sum_gu(input_array, output_array2)

#run each function 100 times and record the time

print("jit time:", timeit.timeit("row_sum_jit(input_array, output_array)", "from __main__ import row_sum_jit, input_array, output_array", number=100))

print("guvectorize time:", timeit.timeit("row_sum_gu(input_array, output_array2)", "from __main__ import row_sum_gu, input_array, output_array2", number=100))

这给我以下输出(时间有所不同):

jit time: 12.04114792868495

guvectorize time: 5.415564753115177

因此,并行代码再次快两倍(只有当行数是CPU内核数的整数倍时,否则性能优势会减弱),即使它使用所有cpu内核,而jit代码只使用一个(使用htop验证).

我在一台配有4x AMD Opteron 6380 CPU(总共64个内核),256 GB RAM和Red Hat 4.4.7-1操作系统的机器上运行.

我使用Anaconda 4.2.0与Python 3.5.2和Numba 0.26.0.

我如何进一步提高并行性能或我做错了什么?

谢谢你的答案.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值