我在我的Python代碼中使用C連續的內存視圖,我想使用需要Fortran連續內存視圖的dgemm
。 我想使用函數PyMemoryView_GetContiguous找到here但我不知道如何訪問它。製作一個內存視圖C連續的Fortran連續
有人知道我需要做哪些導入嗎?
我不想使用函數copy_fortran(),因爲它確實會減慢我的代碼。
我在我的Python代碼中使用C連續的內存視圖,我想使用需要Fortran連續內存視圖的dgemm
。 我想使用函數PyMemoryView_GetContiguous找到here但我不知道如何訪問它。製作一個內存視圖C連續的Fortran連續
有人知道我需要做哪些導入嗎?
我不想使用函數copy_fortran(),因爲它確實會減慢我的代碼。
PyMemoryView_GetContiguous
看起來不像Cython標準的一部分暴露出來,不幸的是。它應該是相當容易,雖然包裝:
from cpython.buffer cimport PyBUF_READ # we'll need this later
cdef extern from "Python.h":
# copy the signature replacing PyObject* with object to let Cython
# handle the reference counting
object PyMemoryView_GetContiguous(object, int, char)
def test(double[:,::1] c_contig):
f_contig = PyMemoryView_GetContiguous(c_contig, PyBuf_READ,'F')
# .... do something useful
注意,這仍然將涉及複製所有內存(這絕對是不可避免的!),所以不太可能是顯著快於copy_fortran
。
有一個問題 - PyMemoryView_GetContiguous
不會返回一個可寫memoryview除非它沒有進行復制,並用Cython需要分配到類型化memoryview東西可寫,所以你只能把它作爲一個Python對象。
雖然你可以得到一個指向第一個元素的指針 - 創建的基礎對象是一個對象,所以你可以得到一個char*
然後將它轉換爲你需要的任何指針。這應該足以稱爲您的Fortran函數了:
cdef char* as_bytes = f_contig.obj
some_function(<double*>as_bytes)
一個評論,因爲這是一個猜測:它看起來好像你現在有矩陣存儲在行的主要順序,這是你想的轉置你要。但是,您可以使用dgemm中的轉置選項來使用C(T)=(AB)(T)= B(T)A(T),以避免必須更改存儲器佈局? (其中(T)表示轉置) –
這終於解決了我的問題。謝謝 ! – 14thibea