【发布时间】:2018-08-30 15:48:20
【问题描述】:
我想使用 Cython 并行执行一些独立的计算。
现在我正在使用这种方法:
import numpy as np
cimport numpy as cnp
from cython.parallel import prange
[...]
cdef cnp.ndarray[cnp.float64_t, ndim=2] temporary_variable = \
np.zeros((INPUT_SIZE, RESULT_SIZE), np.float64)
cdef cnp.ndarray[cnp.float64_t, ndim=2] result = \
np.zeros((INPUT_SIZE, RESULT_SIZE), np.float64)
for i in prange(INPUT_SIZE, nogil=True):
for j in range(RESULT_SIZE):
[...]
temporary_variable[i, j] = some_very_heavy_mathematics(my_input_array)
result[i, j] = some_more_maths(temporary_variable[i, j])
这种方法有效,但我的问题来自于我实际上需要几个temporary_variables。当INPUT_SIZE 增长时,这会导致大量内存使用。但我相信真正需要的是每个线程中的临时变量。
我是否面临 Cython prange 的限制,我需要学习正确的 C 还是我在做/理解一些非常错误的事情?
编辑:我正在寻找的函数是openmp.omp_get_max_threads() 和openmp.omp_get_thread_num(),用于创建大小合理的临时数组。我必须先cimport openmp。
【问题讨论】:
-
Cython 通常会正确分配线程局部变量(如果您只是将其设为标量而不是数组)。 take 失败,看看能不能把循环体放在一个单独的函数里,有自己的局部变量
-
@DavidW 感谢您的帮助。我可能应该将我的代码拆分成更小的函数,因为我需要数组。不幸的是,我正在努力弄清楚该怎么做。
-
我会在接下来的几天里尝试写一个完整的答案,但我的建议是,如果显示的两行(
temp_var = ...和some_more_maths(temp_var))包含在一个函数中,那么变量是函数本地的(所以绝对是线程本地的)
标签: multithreading numpy memory-management cython gil