Я начал возиться с параллельным программированием и Cython/OpenMP, и у меня есть простая программа, которая суммирует по массиву с помощью Прейндж:Локальные параллельные вычисления для операции суммирования
import numpy as np
from cython.parallel import prange
from cython import boundscheck, wraparound
@boundscheck(False)
@wraparound(False)
def parallel_summation(double[:] vec):
cdef int n = vec.shape[0]
cdef double total
cdef int i
for i in prange(n, nogil=True):
total += vec[i]
return total
Это похоже на работу ОК с файлом setup.py. Тем не менее, мне было интересно, можно ли настроить эту функцию и немного больше контролировать, что делают процессоры.
Предположим, у меня есть 4 процессора: я хочу разбить вектор, который будет суммирован на 4 части, а затем каждый процессор локально добавит элементы внутри. Затем, в конце, я могу комбинировать результаты от каждого процессора, чтобы получить общую сумму. Из документации cython я не смог понять, возможно ли что-то подобное или нет (документация немного разрежена).
Я был бы признателен, если бы кто-нибудь мог объяснить, если/как что-то подобное делается с помощью cython/openmp, или, может быть, поможет найти подходящие примеры (его было неожиданно трудно найти в Интернете).