Время работы параллельной функции в Cython - PullRequest
0 голосов
/ 29 марта 2019

У меня есть две очень простые функции Cython, работающие на месте, такие как следующие (скомпилированные с -fopenmp):

#cython: language_level=3
#cython: wraparound=False
#cython: boundscheck=False
#cython: nonecheck=False
#cython: cdivision=True

import numpy as np
cimport numpy as np
cimport cython
from cython.parallel cimport prange, parallel


def ta_pa(double[:,::1] out, double[:,::1] u, double[:,::1] K, double a):


    cdef Py_ssize_t ix, iz
    cdef Py_ssize_t nx = out.shape[0]
    cdef Py_ssize_t nz = out.shape[1]

    with nogil, parallel():
        for ix in prange(nx):
            for iz in range(nz):
                out[ix, iz] = u[ix, iz] - a*K[ix, iz]

def ta_li(double[:,::1] out, double[:,::1] u, double[:,::1] K, double a):


    cdef Py_ssize_t ix, iz
    cdef Py_ssize_t nx = out.shape[0]
    cdef Py_ssize_t nz = out.shape[1]


    for ix in range(nx):
        for iz in range(nz):
            out[ix, iz] = u[ix, iz] - a*K[ix, iz]

Когда я тестирую эти две функции в ноутбуке с timeit, я получаюследующие результаты с массивами 256x256:

  • ta_li: 43,3 мкс
  • ta_pa: 28,1 мкс

Пока все в порядке!но когда я заменяю ta_li на ta_pa в большем скрипте (который запускается - среди прочего - эта функция несколько тысяч раз), его выполнение становится намного медленнее, чем при использовании с ta_li!

  • При выполнении моего сценария с ta_li, 1 процессор в действии
  • При выполнении моего сценария с ta_pa, 4 процессора в действии
  • Я использовал 256x256 массивов во всех тестах

Я уверен, что есть подходящее объяснение этому поведению, но я его не понимаю.Есть гипотеза?

...