2017-07-17 123 views
0

我在我的Python代碼中使用C連續的內存視圖,我想使用需要Fortran連續內存視圖的dgemm。 我想使用函數PyMemoryView_GetContiguous找到here但我不知道如何訪問它。製作一個內存視圖C連續的Fortran連續

有人知道我需要做哪些導入嗎?

我不想使用函數copy_fortran(),因爲它確實會減慢我的代碼。

+0

一個評論,因爲這是一個猜測:它看起來好像你現在有矩陣存儲在行的主要順序,這是你想的轉置你要。但是,您可以使用dgemm中的轉置選項來使用C(T)=(AB)(T)= B(T)A(T),以避免必須更改存儲器佈局? (其中(T)表示轉置) –

+0

這終於解決了我的問題。謝謝 ! – 14thibea

回答

0

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)