2017-06-20 102 views
2

所以我想幫助另一個SO用戶,並且在這個過程中,我無法創建一個Cython程序來執行一些簡單的NumPy外部操作,這迫使我使用GIL。這使得使用OpenMP(多核)成爲不可能。然後,我遇到了一個有趣的帖子,而您可以從SciPy Fortran庫直接導入用NumPy安裝的Cython代碼(BLAS,LAPACK),在我的情況下是英特爾MKL等效函數。我想要做的是一個簡單的向量乘以2個向量1000x1維度的另一個轉置,導致1000x1000矩陣。但是我找不到相關的Fortran程序(相當於NumPy乘法),它可以做到這一點。所有的例程似乎都做了矩陣乘法。所以現在在SciPy中很酷的功能是將它添加到您的Cython模塊中:import scipy.linalg.cython_blas as blascimport scipy.linalg.cython_lapack as lapack然後理論上我開始使用Fortran庫dgemm,通過調用blas.dgemm(options),但它執行的是矩陣乘積而不是元素乘法。有沒有人知道Fortan模塊可以完成2個1000x1矢量的簡單乘法,1個轉置,產生一個1000x1000的矩陣?如果你可以添加很好的輸入語法。我將C連續內存視圖傳遞給函數,即[:: 1] Cython NumPy向量。在使用NOGIL的Cython中使用Fortran NumPy操作,相當於NumPy乘法的Fortran庫是什麼?

+0

您可能不需要這樣做。您可以將小GIL需要的部分封裝在'with gil:'塊中。乘法(可能)在內部再次釋放GIL,所以如果這是你希望做的事情,可能(可能)大部分與其他代碼並行運行。 – DavidW

+0

@DavidW你說得對,我不必這樣做,但我想將它添加到我的Cython工具箱中......我一直在使用Python,任何可以加速OpenMP的東西都變得更好。從這個意義上說,將Fortan指針直接指向Scipy和Cython非常有吸引力。 – Matt

回答

3

你所描述的是純粹的NumPy功能,稱爲"broadcasting"。這些廣播操作使用C(或Cython)代碼完成。您可以隨時通過Python C API(例如PyNumber_Multiply)訪問它們(儘管它們可能不會釋放GIL),但Cython中的正常乘法應該委託給該函數,因此您通常不需要調用(或導入)它直接。

BLAS/LAPACK主要用於線性代數的東西,即使您可以「使用」暴露在那裏的功能,它也不會與NumPy使用的(通常)相同。

+0

謝謝你的閱讀材料。我相信可以使用Hadamard產品完成2個向量的元素乘法,但這僅在MKL中(即,我沒有在'scipy.linalg.cython_lapack'文件中看到定義)https://stackoverflow.com/a/29950051/6037118雖然如果您知道任何示例文件以顯示如何包含可以啓動我的MKL庫,那麼'vdmul'就是庫:https://software.intel.com/zh-cn/mkl-顯影劑基準FORTRAN-v-MUL – Matt