作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不明白为什么从 Python 调用时会崩溃。调用 Intel MKL 的 vdMul
函数只是一个简单的 Cython 代码 https://software.intel.com/en-us/mkl-developer-reference-c-v-mul .我试过将 MKL 中的每个 DLL 复制到目录中并重写不同的部分,但它一直崩溃,尽管编译正常。发帖在这里,因为我可能对使用 C++ 更有经验的人犯了一个明显的错误。这是 PYX 代码:
import numpy as np
cimport numpy as np
cimport cython
from cython cimport view
cdef extern from "mkl.h" nogil:
double* vect_mult "vdMul"(int n,
double *a,
double *b,
double *y)
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
cpdef mult(double[::1] A, double[::1] B, double[:,::1] output):
cdef int Ashape0=A.shape[0], Bshape0=B.shape[0]
cdef int N = Ashape0*Bshape0
with nogil:
vect_mult(N, &A[0], &B[0], &output[0,0])
#test script
from cyblas import mult
import numpy as np
a=np.random.randn(1000)
b=np.random.randn(1000)
output = np.zeros((a.shape[0],b.shape[0]))
mult(a,b,output)
最佳答案
我不确定,你想做什么。据我理解vdMult
的含义:它的结果是一个n维 vector ,out[i]=a[i]*b[i]
。所以
1000
。Ashape0*Bshape0
而不是 min(Ashape0,Bshape0)
您会在程序尝试越界访问数组时遇到段错误。 你的代码应该是这样的:
cpdef mult(double[::1] A, double[::1] B, double[::1] output):
cdef int N = A.shape[0]#assuming all vectors have the same size
with nogil:
vect_mult(N, &A[0], &B[0], &output[0,0])
编辑 vdMult
执行逐点乘法。我假设您想要做的是计算 out=a*b^t
,即 out[i][j]=a[i]*b[j]
。
所以这是一个普通的矩阵乘法,你可以使用 cblas_dgemm
.在您的情况下,调用将是 (n
- vector a
中的元素数,m
- b 中的元素数
):
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
n, m, 1, 1.0, A, 1, B, m, 0.0, C, m);
关于c++ - Cython 调用 MKL 通过 vdMul 在元素乘法上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893518/
我不明白为什么从 Python 调用时会崩溃。调用 Intel MKL 的 vdMul 函数只是一个简单的 Cython 代码 https://software.intel.com/en-us/mkl
我是一名优秀的程序员,十分优秀!