2017-07-17 55 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)