如何建立和存储这个大的下三角矩阵以进行矩阵-向量乘法?
我需要创建一个具有特殊结构的下部三角矩阵,然后进行矩阵矢量乘法. 矩阵由值k参数化.它的主角是k ^ 0的向量,即1;第一个子对角线是k ^ 1的向量,i -th sub-diagonal保持k ^ i. . 这是一个5 x 5的示例,k = 0.9: structure(c(1, 0.9, 0.81, 0.729, 0.6561, 0, 1, 0.9, 0.81, 0.729, 0, 0, 1, 0.9, 0.81, 0, 0, 0, 1, 0.9, 0, 0, 0, 0, 1), .Dim = c(5L, 5L)) # [,1] [,2] [,3] [,4] [,5] #[1,] 1.0000 0.000 0.00 0.0 0 #[2,] 0.9000 1.000 0.00 0.0 0 #[3,] 0.8100 0.900 1.00 0.0 0 #[4,] 0.7290 0.810 0.90 1.0 0 #[5,] 0.
2 2023-05-24
编程技术问答社区
OpenCL的矩阵乘法应该更快?
我正在尝试学习如何制作GPU最佳的Opencl Kernells,我以本地内存中的方形图进行了矩阵乘法的示例.但是与numpy.dot()(5 Gflops,它使用blas)相比,我最多只能得到〜10倍的加速(〜50 Gflops). 我找到了研究,他们得到了加速> 200倍(> 1000 Gflops). #define BLOCK_SIZE 22 __kernel void matrixMul( __global float* Cij, __global float* Aik, __global float* Bkj, __const int ni, __const int nj, __const int nk ){ // WARRNING : interchange of i and j dimension lower the performance >2x on my nV G
0 2023-05-23
编程技术问答社区
计算包含高维向量的两个矩阵之间最小欧几里得距离的最快方法
我在另一个线程,但后来我专注于如何使用OpenCV.未能实现我最初想要的东西,我会在这里询问我想要什么. 我有两个矩阵.矩阵A为2782x128,矩阵B为4000x128,均为无符号char值.值存储在一个数组中.对于a中的每个向量,我需要B中最接近欧几里得距离的B中向量的索引. 好吧,现在我的代码来实现这一目标: #include #include #include #include #include #include #include #include #include #include "main.h" using namespace std; void main(int argc, char* argv[]) { int a_size; unsigned
2 2023-05-23
编程技术问答社区
用位数转换的方法实现快速整数矩阵乘法
我问是否可以使用>钻头操作.矩阵很小,元素是小的非负整数(最多均值20). 要保持我们的专注,让我们非常具体,说我有两个3x3矩阵,带有整数条目0 以下NAIVE C ++实现执行了100万次执行左右,用Linux time进行了测量. #include int main() { //Random number generator std::random_device rd; std::mt19937 eng(rd()); std::uniform_int_distribution distr(0, 15); int A[3][3]; int B[3][3]; int C[3][3]; for (int trials = 0; trials
0 2023-05-23
编程技术问答社区
OpenMP并行化矩阵乘法的三重for循环(性能问题)。
我正在用OpenMP编写用于矩阵乘法的程序,为了缓存便利,它实现了A X B(transpose)行X行而不是经典A X B行X列X行,以提高缓存效率.这样做,我面临一个有趣的事实,即对我而言是不合逻辑的:如果在此代码中,则与将OpenMP指令放在最内部循环中的情况下,该程序较慢,在我的计算机中,时代为10.9 vs 8.1秒. //A and B are double* allocated with malloc, Nu is the lenght of the matrixes //which are square //#pragma omp parallel for for (i=0; i
0 2023-05-23
编程技术问答社区
提高Scipy稀疏矩阵的乘法性能
给定一个尺寸(170k x 170k)的Scipy CSC稀疏矩阵" SM",具有4.4亿个非零点点和一个稀疏的CSC Vector" V"(170K x 1),有几个非零点,有没有任何东西这可以改善操作的性能: resul = sm.dot(v) ? 目前大约需要1秒钟.将矩阵初始化为CSR的时间增加3秒,因此CSC的表现更好. sm是产品和V之间相似之处的矩阵,是代表用户购买或点击的产品的向量.因此,对于每个用户,SM都是相同的. 我正在使用Ubuntu 13.04,Intel I3 @3.4GHz,4个核心. 研究,因此我阅读了有关ABLAS软件包的信息.我输入了终端: ~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so 导致: linux-vdso.so.1 => (0x00007fff56a88000) libblas.so.3 => /
12 2023-05-23
编程技术问答社区
从右到左的矩阵乘法更快评估
我注意到,根据右至左>的二次形式评估矩阵操作的速度明显比r中在R中的 的速度要快得多,具体取决于括号的放置方式.显然,它们都执行相同数量的计算.我想知道为什么是这种情况.这与内存分配有关吗? # A: 5000 * 5000 # B: 5000 * 2 A = matrix(runif(5000 * 5000), nrow = 5000) B = matrix(rbinom(5000 * 2, size = 2, prob = 0.3), nrow = 5000) microbenchmark((t(B) %*% A) %*% B, t(B) %*% (A %*% B), times = 100) 这是会话信息: R version 4.2.0 (2022-04-22) Platform: aarch64-apple-darwin20 (64-bit) Running under: macOS Big Sur 11.4 Matrix products: default
0 2023-05-23
编程技术问答社区
大型密集矩阵乘法的循环翻转/阻塞
我想知道是否有人可以向我展示如何有效地使用循环瓷砖/环阻塞来有效地进行大型密集矩阵乘法.我正在使用1000x1000矩阵进行 c = ab .我遵循了Wikipedia上的示例以进行循环瓷砖,但是使用平铺比没有瓷砖的结果更糟. http://en.wikipedia.org/wiki/wiki/loop_tiling http://software.intel.com/en-us/articles/how-to-to-use-use-loop-blocking-to-poptimize-memory-use-use-us-on-32-bit-intel-体系结构 我在下面提供了一些代码.由于缓存错过,幼稚的方法非常慢.转置方法创建了缓冲液中 b 的转置.此方法给出了最快的结果(矩阵乘法如O(n^3),而转置为O(n^2),因此进行转置至少速度至少1000倍).没有阻塞的Wiki方法也很快,不需要缓冲区.阻止方法较慢.阻止的另一个问题是必须多次更新块.这是螺纹/OpenMP的
0 2023-05-23
编程技术问答社区
想知道为什么scipy.spatial.distance.sqeuclidean慢了两倍((y1-y2)** 2)
这是我的代码 import numpy as np import time from scipy.spatial import distance y1=np.array([0,0,0,0,1,0,0,0,0,0]) y2=np.array([0. , 0.1, 0. , 0. , 0.7, 0.2, 0. , 0. , 0. , 0. ]) start_time = time.time() for i in range(1000000): distance.sqeuclidean(y1,y2) print("--- %s seconds ---" % (time.time() - start_time)) ---- 15.212640523910522秒--- start_time = time.time() for i in range(1000000): np.sum((y1-y2)**2) print("--- %s seconds ---" %
0 2023-05-23
编程技术问答社区
Eigen中的高效矩阵转置矩阵乘法
我可以访问许多矩阵库,但是对于此项目,我正在使用EIGEN,因为它的编译时间定义及其包含SVD. 现在,我正在做以下操作: Eigen::Matrix A; // populated in the code Eigen::Matrix B = A.transpose() * A; 我了解,这使A的副本并形成了转置,该转置再次乘以A.此操作是在相对较小的矩阵上执行的(M = 20-30,n = 3),但每秒数百万次,这意味着它必须尽可能快. 我阅读以下速度更快: B.noalias() = A.transpose() * A; 我可以编写自己接受A作为输入并填充B的子例程,但是我想知道是否有有效的现有实现使用最少的周期. 解决方案 首先,由于特征依赖于模板表达式,A.transpose()不评估临时. 其次,在: Matrix B = A.transpose
8 2023-05-23
编程技术问答社区
不同优化下的Fortran矩阵乘法性能
我正在阅读"与Fortran的科学软件开发"一书,其中有一个练习,我认为非常有趣: "创建一个称为MatrixmultiplyModule的Fortran模块.在其称为loopmatrixmultipiply,intinsicmatrixmultipiply和mixmatrixmultipiply上添加三个子例程.每个例程都应将两个真实的矩阵作为参数,作为参数,执行Matriflifations,并通过matriflication进行乘法,并通过第三个参数返回.完全用do循环编写,没有阵列操作或固有过程;应使用矩阵固有功能编写intinsicmatrixmultiply;并且应该使用某些do loops和intinsin函数dot_product编写mixmatrixmultipiply.执行不同尺寸矩阵的矩阵乘法的三种不同方法." 我对两个等级2矩阵的倍数进行了一些测试,这是结果,在不同的优化标志下: compiler:ifort version 13.0.0 on
2 2023-05-23
编程技术问答社区
为什么我的Strassen's矩阵乘法很慢?
我在C ++中写了两个矩阵乘法程序:常规MM (source)和Strassen的MM (source),两者都在2^k x 2^k的平方矩阵上运行). 结果很糟糕.对于1024 x 1024矩阵,常规MM服用46.381 sec,而Strassen的MM take 1484.303 sec(25 minutes !!!!). 我试图使代码尽可能简单.在网络上发现的其他Strassen的MM示例与我的代码没有太大不同. Strassen代码的一个问题很明显 - 我没有截止点,可以切换到常规MM. 我的Strassen的MM代码还有其他哪些问题??? 谢谢! 直接链接到来源 http://pastebin.com/hqhtfpq9 http://pastebin.com/usrq5tuy edit1. 拳头,很多很棒的建议.感谢您花时间并分享知识. 我实施了更改(保留了所有代码),增加了截止点. 2048x2048矩阵的毫米,带有截止512的矩
4 2023-05-23
编程技术问答社区
C语言与Python/numpy的数学性能差
近乎解答/相关: blas如何获得如此极端的性能?(如果您想要在C中快速matmul,认真地使用一个好的Blas库,除非您想手工调整自己的ASM版本.)但这并不意味着看到当您编译较低优化的矩阵代码时会发生什么. 如何优化矩阵乘法(MATMUL)代码以在单个处理器核心上快速运行 带有块的矩阵乘法 出于兴趣,我决定比较(廉价)手写的C与Python/Numpy的性能,表现出一个简单的矩阵乘法,该矩阵的乘数是两个大的,正方形的矩阵,填充了从0到1的随机数. . . 我发现Python/Numpy的表现超过了10,000x,这显然是不正确的,那么导致其性能如此差的C代码有什么问题? (甚至用-o3或-ofast编译) python: import time import numpy as np t0 = time.time() m1 = np.random.rand(2000, 2000) m2 = np.random.rand(2000, 2000) t1 =
2 2023-05-23
编程技术问答社区
Matlab中的快速矩阵乘法
我需要在非常大的MATLAB中制作一个矩阵/矢量乘法:" A"是一个655360 x 5实值矩阵,不一定是稀疏的," B"是655360 x 1个实值载体.我的问题是如何计算:b'*有效. 我通过计算A'*b的时间略有改进,这给出了列向量.但是它仍然很慢(我需要在程序中多次执行此操作). 有了一点搜索,我发现了一个有趣的MATLAB工具箱 mtimesx james Tursa,我希望这能改善上述矩阵乘法性能.经过几次试验,我只能对Matlab天然矩阵乘法获得很小的收益. 关于如何重写A'*b,以使操作更有效?谢谢. 解决方案 Matlab的Raison d'Etre正在进行矩阵计算.如果您可以用手工制作的工具大大优于其内置矩阵乘法,我会感到非常惊讶.首先,您应确保实际上可以更快地执行乘法.您可以通过使用特征>在C ++中实现类似的乘法来做到这一点. 其他解决方案 我使用 gpu ,使用MATLAB矩阵乘法获得了很好 其他解决方案 为了避免转置操作
0 2023-05-23
编程技术问答社区
为什么.NET中的矩阵乘法如此缓慢?
我不太了解是什么使C#/.Net(甚至Java)中的矩阵乘法如此慢. 看一下这个基准( c#的整数和双重性能与MSVC ++编译的C ++相似.在32位整数中,双倍的速度为87%,而99%的速度为99%.该死的很好,我会说.但是,请查看矩阵乘法.差距扩大到C#的速度约为19%.这是我不明白的非常巨大的差异.矩阵乘法只是一堆简单的数学.怎么这么慢?它不应该像简单数量的简单浮点或整数操作一样快吗? 这尤其引起了游戏和XNA的关注,在XNA中,矩阵和向量性能对于物理引擎等事情至关重要.不久前,Mono通过一些漂亮的向量和矩阵类添加了对SIMD指令的支持.它缩小差距并比手写的C ++更快,尽管与SIMD不如C ++快. ( source ) ) 这里发生了什么? 编辑:仔细观察,我误读了第二个图. C#看起来很近. 第一个基准是在做可怕的事情吗?对不起,我错过了第一个基准上的版本编号.我将其作为方便的参考,用于我一直听到的" C#线性代数很慢".我会尝试找到另一个.
0 2023-05-23
编程技术问答社区
为什么这种天真的矩阵乘法比基数R'快?
在R中,矩阵乘法非常优化,即实际上只是对Blas/Lapack的调用.但是,我为矩阵矢量乘法的这种非常幼稚的C ++代码感到惊讶,似乎快30%了. library(Rcpp) # Simple C++ code for matrix multiplication mm_code = "NumericVector my_mm(NumericMatrix m, NumericVector v){ int nRow = m.rows(); int nCol = m.cols(); NumericVector ans(nRow); double v_j; for(int j = 0; j
0 2023-05-23
编程技术问答社区