每次新通话时Cython代码变慢

时间:2016-09-06 09:11:10

标签: python arrays multiprocessing cython shared-memory

我有一组进程异步更新位于没有锁定的共享内存中的两个数组。他们使用以下cython代码:

@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
cdef void c_apply_grads_rmsprop(float[::1] m, float[::1] g, float[::1] p, 
                           unsigned int p_size, int _type, 
                           float lr, float alpha, float e) nogil:

    cdef unsigned int i
    for i in range(p_size):
        m[i] = alpha * m[i] + (1 - alpha) * (g[i] ** 2)
        p[i] -= lr * g[i] / sqrt(m[i] + e)

def apply_grads_mom_rmsprop(m, g, v, v_size, _type, lr, alpha, e):
    c_apply_grads_mom_rmsprop(m, g, v, v_size, _type, lr, alpha, e)

mpg都作为numpy数组传递给cython函数。 g是一个“纯”的numpy数组,在每次调用之前都会填充新数据。 mp指向位于共享内存中的数组。它们创建为RawArray(ctypes.c_float, size),并使用np.frombuffer(..., ctypes.c_float)包装到numpy数组中。

如果我只有一个进程,则该函数的平均执行时间似乎是稳定的。但是,当我启动多个进程时,平均执行时间会不断增加。为什么会这样?

旁注...我的代码可以进一步优化吗?

0 个答案:

没有答案