У меня есть несколько независимых вычислений, которые я хотел бы выполнять параллельно с помощью 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_variable
. Это приводит к огромному использованию памяти при увеличении INPUT_SIZE
. Но я считаю, что действительно нужна временная переменная в каждом потоке.
Я столкнулся с ограничением Cython prange и мне нужно изучить правильный C, или я делаю/понимаю что-то ужасно неправильное?
EDIT: функции, которые я искал, были openmp.omp_get_max_threads()
и openmp.omp_get_thread_num()
для создания временного массива разумного размера. Я должен был cimport openmp
сначала.
temp_var = ...
иsome_more_maths(temp_var)
) содержатся в функции, то переменная является локальной для функции (поэтому определенно поток локальный) - person DavidW   schedule 31.08.2018