我在我的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