第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Cython 將 np.ndarray 傳遞給 Fortran

使用 Cython 將 np.ndarray 傳遞給 Fortran

肥皂起泡泡 2022-12-20 16:17:30
我正在用 Python 包裝 Fortran 模塊。我選擇使用 Cython 來做到這一點。我的問題是將 a 傳遞np.ndarray給 Fortran。我能夠np.ndarray從 Fortran 收到一個,但我所有傳遞給 Fortran 的嘗試都沒有奏效。我發(fā)現(xiàn),問題直接出在 Cython - Fortran 接口上,因為我的 Fotran 子例程工作正常(盡可能在沒有數(shù)據(jù)的情況下工作)。Cython 端似乎也能正常工作,我可以在那里操作變量。我的最低工作示例:PATTERN_wrap.f90module PATTERN_wrap    use iso_c_binding, only: c_float, c_double, c_short, c_int    implicit noneCONTAINS    subroutine c_pattern(scalar_variable, array_variable, return_array) bind(c)        implicit NONE        INTEGER(c_int), intent(in) :: scalar_variable        INTEGER(c_int), intent(in), DIMENSION(10, 15) :: array_variable        REAL(c_float), INTENT(OUT), DIMENSION(10) :: return_array        write(*,*) "start fortran"        write(*,*) "scalar_variable"        write(*,*) scalar_variable        write(*,*) "array_variable"        write(*,*) array_variable        return_array = 3        write(*,*) "end fortran"!        call DO_PATTERN(&!                scalar_variable=scalar_variable, &!                array_variable=array_variable, &!                return_array=return_array)!    end subroutineend module PATTERN_wrap注意:對實際執(zhí)行某些操作的子程序的調(diào)用DO_PATTERN已被注釋掉,因為此時它不相關(guān)。我只是想指出上面的代碼是一個包裝器。pattern.pyx#cython: language_level=3import cythonimport numpy as npcimport numpy as npcdef extern:    void c_pattern(            int *scalar_variable,            int *array_variable,            float *return_array    )def run_pattern(        int scalar_variable,):    cdef:        np.ndarray[int, ndim=2, mode="fortran"] array_variable = np.ones((10,15), dtype=np.int32, order='F')        np.ndarray[float, ndim=1, mode="fortran"] return_array = np.zeros(10, dtype=np.float32, order='F')    c_pattern(        &scalar_variable,        &array_variable[0,0],        &return_array[0],    )    print('Cython side')    print(return_array)    return return_array
查看完整描述

1 回答

?
婷婷同學_

TA貢獻1844條經(jīng)驗 獲得超8個贊

我設(shè)法找到了解決方案。代碼沒問題。問題是我的配置。


如上所述,我測試了 gcc/gfortran 的不同配置,看它是否影響 Cythonizing。它不是。因此,我繼續(xù)反匯編我的 Dockerfile,以找到導致代碼中斷的步驟。原來是conda安裝了numpy。


我上面使用 pip 進行的所有 ggc 圖像測試:


$ python -m pip install numpy

Collecting numpy

  Downloading numpy-1.18.4-cp38-cp38-manylinux1_x86_64.whl (20.7 MB)

     |████████████████████████████████| 20.7 MB 18.9 MB/s

Installing collected packages: numpy

Successfully installed numpy-1.18.4

一包一輪,快速簡單。但是,我在“生產(chǎn)”圖像中使用了 conda。


如果你通過 conda 安裝 numpy:


$ conda install numpy

Collecting package metadata (current_repodata.json): done

Solving environment: done


## Package Plan ##


  environment location: /opt/conda


  added / updated specs:

    - numpy



The following packages will be downloaded:


    package                    |            build

    ---------------------------|-----------------

    blas-1.0                   |              mkl           6 KB

    intel-openmp-2020.1        |              217         780 KB

    libgfortran-ng-7.3.0       |       hdf63c60_0        1006 KB

    mkl-2020.1                 |              217       129.0 MB

    mkl-service-2.3.0          |   py38he904b0f_0          62 KB

    mkl_fft-1.0.15             |   py38ha843d7b_0         159 KB

    mkl_random-1.1.1           |   py38h0573a6f_0         341 KB

    numpy-1.18.1               |   py38h4f9e942_0           5 KB

    numpy-base-1.18.1          |   py38hde5b4d6_1         4.2 MB

    ------------------------------------------------------------

                                           Total:       135.5 MB


...

這里需要注意的重要一點是,除了 numpy 之外,conda 也在安裝libgfortran-ng-7.3.0. 在我正在處理的圖像中,安裝了 gcc/gfortran 8.5.0。


為什么這很重要?當你運行 cython 編譯時:


$ python setup.py build_ext --inplace

running build_ext

cythoning pattern.pyx to pattern.c

building 'pattern' extension

creating build

creating build/temp.linux-x86_64-3.8

gcc -pthread -B /opt/conda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/opt/conda/lib/python3.8/site-packages/numpy/core/include -I/opt/conda/include/python3.8 -c pattern.c -o build/temp.linux-x86_64-3.8/pattern.o

In file included from /opt/conda/lib/python3.8/site-packages/numpy/core/include/numpy/ndarraytypes.h:1832,

                 from /opt/conda/lib/python3.8/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,

                 from /opt/conda/lib/python3.8/site-packages/numpy/core/include/numpy/arrayobject.h:4,

                 from pattern.c:599:

/opt/conda/lib/python3.8/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]

 #warning "Using deprecated NumPy API, disable it with " \

  ^~~~~~~

gcc -pthread -shared -B /opt/conda/compiler_compat -L/opt/conda/lib -Wl,-rpath=/opt/conda/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.8/pattern.o -lgfortran -o /mwe/pattern.cpython-38-x86_64-linux-gnu.so PATTERN_wrap.o

正如您在列表行中看到的,傳遞給 gcc 的包含是/opt/conda/lib.


$ ls /opt/conda/lib | grep "fortran"

libgfortran.so

libgfortran.so.4

libgfortran.so.4.0.0          

這是libgfortran我最初編譯代碼時使用的不同版本。


解決方案是:


$ conda install -c conda-forge libgfortran-ng==8.2.0

注意:使用 conda-forge 通道是必要的,在我的例子中,conda 無法解決僅來自基本通道的包的依賴關(guān)系。此外,此版本的 libgfortran-ng 還需要將 libblas 從 openblas 版本更改為 mkl,如果您擔心的話。


通過這種方式,我在 conda 中安裝了一個 libgfortran,它與我在系統(tǒng)中使用的主版本相同。重新運行 Cythonized 包的編譯后,一切正常。


無論如何,當心康達。



查看完整回答
反對 回復(fù) 2022-12-20
  • 1 回答
  • 0 關(guān)注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號