我有一组进程异步更新位于没有锁定的共享内存中的两个数组。他们使用以下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)
m
,p
和g
都作为numpy数组传递给cython函数。 g
是一个“纯”的numpy数组,在每次调用之前都会填充新数据。 m
和p
指向位于共享内存中的数组。它们创建为RawArray(ctypes.c_float, size)
,并使用np.frombuffer(..., ctypes.c_float)
包装到numpy数组中。
如果我只有一个进程,则该函数的平均执行时间似乎是稳定的。但是,当我启动多个进程时,平均执行时间会不断增加。为什么会这样?
旁注...我的代码可以进一步优化吗?