- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
单个 numpy einsum 语句能否复制 gemm功能?标量和矩阵乘法看起来很简单,但我还没有找到如何让“+”工作。如果更简单,D = alpha * A * B + beta * C 是可以接受的(实际上更可取)
alpha = 2
beta = 3
A = np.arange(9).reshape(3, 3)
B = A + 1
C = B + 1
left_part = alpha*np.dot(A, B)
print(left_part)
left_part = np.einsum(',ij,jk->ik', alpha, A, B)
print(left_part)
最佳答案
这里似乎有些困惑:np.einsum
处理可以按以下形式转换的操作:broadcast–multiply–reduce。逐元素求和不属于其范围。
乘法需要这种东西的原因是“天真地”写出这些操作可能会很快超出内存或计算资源。例如,考虑矩阵乘法:
import numpy as np
x, y = np.ones((2, 2000, 2000))
# explicit loop - ridiculously slow
a = sum(x[:,j,np.newaxis] * y[j,:] for j in range(2000))
# explicit broadcast-multiply-reduce: throws MemoryError
a = (x[:,:,np.newaxis] * y[:,np.newaxis,:]).sum(1)
# einsum or dot: fast and memory-saving
a = np.einsum('ij,jk->ik', x, y)
然而,爱因斯坦约定分解加法,所以你可以将类似 BLAS 的问题简单地写成:
d = np.einsum(',ij,jk->ik', alpha, a, b) + np.einsum(',ik', beta, c)
具有最小的内存开销(如果您真的关心内存,您可以将其中的大部分重写为就地操作)和恒定的运行时开销(两次 python-to-C 调用的成本)。
因此,关于性能,恭敬地,这对我来说似乎是一个过早优化的案例:您是否真的验证过将类似 GEMM 的操作拆分为两个单独的 numpy 调用是您代码中的瓶颈?如果确实如此,那么我提出以下建议(按照参与度增加的顺序):
仔细尝试!, scipy.linalg.blas.dgemm
.如果你得到我会感到惊讶 显着提高性能,因为 dgemm
通常只 构建 block 本身。
尝试一个表达式编译器(本质上你是在提议 这样的事情)像Theano .
自己写generalised ufunc使用 Cython 或 C。
关于python - GEMM 使用 Numpy einsum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976383/
我写了一些 Naiive GEMM 代码,我想知道为什么它比等效的单线程 GEMM 代码慢得多。 使用 200x200 矩阵,单线程:7ms,多线程:108ms,CPU:3930k,线程池中有 12
Eigen 具有惊人的快速 GEMM 实现,因此我想在我的宠物项目张量库中使用它。如果我理解正确,可以通过 Eigen::Map 实现。我编写了简单的示例并定义了 EIGEN_NO_MALLOC 以确
我注意到 cublasSgemmStridedBatched 的一些奇怪的表现,我正在寻找解释。矩阵大小固定为 20x20。以下是几种不同批量大小的一些时序(仅乘法,无数据传输): 批处理 = 100
单个 numpy einsum 语句能否复制 gemm功能?标量和矩阵乘法看起来很简单,但我还没有找到如何让“+”工作。如果更简单,D = alpha * A * B + beta * C 是可以接受
The netlib documentation of sgemm指出数组步长 LDA 和 LDB 必须是 >= 1,并且足够大,这样列就不会重叠。事实上,Apple 的 Accelerate/vec
当我尝试通过 gpu 将 TensorFlow 与 Keras 结合使用时,我收到此错误消息: C:\Users\nicol\Anaconda3\envs\tensorflow\lib\site-pa
为什么 BLAS 有 gemm矩阵-矩阵乘法函数和一个单独的gemv矩阵向量乘法的函数?矩阵向量乘法不只是矩阵矩阵乘法的一种特殊情况,其中一个矩阵只有一行/列吗? 最佳答案 在数学上,矩阵-向量乘法是
BLAS ?gemm 函数的各种 LDx 参数可以对较大数组的切片进行操作。例如,这个小型 C 程序对 (200,200) 矩阵的左上角和右上角 (100,100) 子矩阵进行矩阵乘法,并将结果存储在
我正在使用 openBLAS 编写一些线性代数程序。该程序需要将两个矩阵相乘;一种是单精度,另一种是 double 。 我查了BLAS引用“http://netlib.org/blas/blasqr.
我正在尝试使用 fortran BLAS gemm 函数进行矩阵乘法,请参阅 here . 这个函数的签名是,所有参数的含义都可以在上面的链接中找到。 call sgemm(transa, trans
我一直在努力理解(但惨遭失败)图像卷积(具有高度、宽度、 channel )是如何在软件中实现的。 我听说有人说他们的卷积实现是使用 GEMM 完成的,或者使用“直接卷积”完成的,或者使用 1x1 内
#include #include #include #include #include using namespace cv; using namespace std; int main() {
这是我的 earlier question 的扩展 , 但我是分开问的,因为我真的很沮丧,所以请不要投反对票! 问题:与密集矩阵的相同 cblas_sgemm 调用相比,对于具有大量零的矩阵,cbla
这是我第一次尝试使用 ATLAS。我无法正确链接它。这是一个非常简单的 sgemm 程序: ... #include const int M=10; const int N=8; const int
我知道 Caffe 使用通用矩阵到矩阵乘法 (GEMM),它是基本线性代数子程序 (BLAS) 库的一部分,用于执行卷积运算。其中卷积转换为矩阵乘法运算。我引用了下面的文章。 https://pete
将两个 data-mapped matrices (Eigen::Map) 相乘时我注意到显着的性能差异取决于内存的分配方式。使用来自自定义分配的内存时,与使用来自 std::vector 的(也对齐
我是一名优秀的程序员,十分优秀!