Tag: 矩阵

C / C ++中简单快速的矩阵向量乘法

我需要频繁使用matrix_vector_mult() ,它将矩阵与向量相乘,下面是它的实现。 问题:是否有一种简单的方法可以使其显着,至少两倍,更快? 备注:1)矩阵的大小约为300×50。 它在运行期间不会改变。 2)它必须适用于Windows和Linux。 double vectors_dot_prod(const double *x, const double *y, int n) { double res = 0.0; int i; for (i = 0; i < n; i++) { res += x[i] * y[i]; } return res; } void matrix_vector_mult(const double **mat, const double *vec, double *result, int rows, int cols) { // […]

最多不能超过50%。 矩阵乘法的理论性能

问题 我正在学习HPC和代码优化。 我试图在Goto的开创性矩阵乘法论文( http://www.cs.utexas.edu/users/pingali/CS378/2008sp/papers/gotoPaper.pdf )中复制结果。 尽管我付出了最大的努力,但我无法超过理论CPU最高性能的50%。 背景 请参阅此处的相关问题( 优化的2×2矩阵乘法:慢速assembly与快速SIMD ),包括有关我的硬件的信息 我尝试过的 这篇相关论文( http://www.cs.utexas.edu/users/flame/pubs/blis3_ipdps14.pdf )对Goto的算法结构有很好的描述。 我在下面提供了我的源代码。 我的问题 我要求一般帮助。 我一直在研究这个问题太久了,尝试了很多不同的算法,内联汇编,各种尺寸的内核(2×2,4×4,2×8,…,mxn m和n大),但我似乎无法打破50%CPU Gflops 。 这纯粹是出于教育目的,而不是作业。 源代码 希望是可以理解的。 请问是否。 我按照上面第2篇文章中的描述设置了宏结构(for loops)。 我按照两篇论文中的讨论打包矩阵,并在图11中以图形方式显示( http://www.cs.utexas.edu/users/flame/pubs/BLISTOMSrev2.pdf )。 我的内核计算2×8块,因为这似乎是Nehalem架构的最佳计算(参见GotoBLAS源代码 – 内核)。 内核基于计算排名1更新的概念,如此处所述( http://code.google.com/p/blis/source/browse/config/template/kernels/3/bli_gemm_opt_mxn.c ) #include #include #include #include #include #include #include #include // define some prefetch functions #define PREFETCHNTA(addr,nrOfBytesAhead) \ _mm_prefetch(((char *)(addr))+nrOfBytesAhead,_MM_HINT_NTA) #define […]

行主要与列主要混淆

我一直在阅读很多关于此事的内容,我读的越多,我就越困惑。 我的理解:在行主要行连续存储在内存中,列主要列连续存储在内存中。 因此,如果我们有一系列数字[1, …, 9]并且我们想将它们存储在行主矩阵中,我们得到: |1, 2, 3| |4, 5, 6| |7, 8, 9| 而专栏(如果我错了,请纠正我)是: |1, 4, 7| |2, 5, 8| |3, 6, 9| 这实际上是前一个矩阵的转置。 我的困惑:嗯,我没有看到任何区别。 如果我们迭代两个矩阵(按第一个中的行和第二个中的列),我们将以相同的顺序覆盖相同的值: 1, 2, 3, …, 9 即使矩阵乘法是相同的,我们采用第一个连续元素并将它们与第二个矩arrays相乘。 所以说我们有矩阵M : |1, 0, 4| |5, 2, 7| |6, 0, 0| 如果我们将前一行主矩阵R乘以M ,即R x M我们将得到: |1*1 + 2*0 + 3*4, 1*5 + […]

将R代码转换为C代码

我正在寻找将R脚本转换为C代码的速度原因以及将其打包为.exe的能力。 我是C.的新手 我的问题是C会明显加快吗? 速率限制步骤是一种必须在大矢量上应用很多次的排序算法。 我不确定R中的矢量化function是否有助于减慢它的速度。 另外我读过在R中for循环效率低下。 如果我应该在C中执行此操作,哪些库可以帮助我模仿R的一些数据处理function,如基本矩阵操作? 我应该从哪里开始? 现在我甚至不知道如何将我的数据读入C(逗号分隔的文本文件)。

康威的生命游戏,计算邻居

我的代码中某处出现错误,我想我正在进入无限循环。 基本上我得到一个矩阵和两个索引,i,j,我需要计算[i] [j]周围有多少邻居的值为1或2。 这是我的代码: int number_of_living_neighbors(matrix mat,int i, int j, int n,int m) { int counter=0,row_index=0,column_index=0; for(row_index=i-1;row_index=0)&&(row_index=0)&&(column_index<m)) { if((mat[row_index][column_index]==1)||(mat[row_index][column_index]==2)) counter++; if((row_index==i)&&(column_index==j)&&(mat[i][j]==1)) counter–; } } } printf("The number of living neighbors is %d", counter); return counter; } 它没有打印任何东西。 mat是我得到的矩阵,i,j是指针,n是行数,m是列数。

矩阵,指针,C *

我有这样的代码: void print_matrix(int **a, int n) { int i, j; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) printf("%d\t", *(a+i*n+j)); putchar('\n'); } } int main () { int matrix[3][3]; insert (matrix); /* Function that reads Matrix from stdin */ print_matrix(matrix, 3); return 1; } 我收到GCC错误: 期望’int **’但参数类型为’int(*)[3] 我阅读了所有相关主题,但我仍然无法找到我的问题的答案,因此在将其标记为重复之前,请阅读它。 […]

如何在不使用循环的情况下在C中初始化N维数组

我想初始化一个3 x 3矩阵,前两行为0,最后一行为1。 我已经声明了一个二维数组int matrix[3][3] 我想初始化它而不使用循环,如下所示 0 0 0 0 0 0 1 1 1 我还想要一个N dimiensional数组的解决方案

(生命游戏)如何循环遍历矩阵的外层而不检查它的外部,同时检查邻居?

矩阵中的每个点代表一个生命或死亡的细胞。 我必须计算每个单元格中有多少个ALIVE邻居。 我有一个function,但它检查边界外的单元格。我不知道如何在不执行大量if-else语句的情况下同时检查邻居并跟踪边缘。 void Neighbours(int rows, int cols, cell world[rows][cols], int neighbors[rows][cols]) { //Loop through each cell in the matrix. for(int rCell = 0; rCell < rows; rCell++){ for(int cCell = 0; cCell < cols; cCell++) { //Reset neighbor count for each cell. neighbors[rCell][cCell] = 0; //Check cell status in cell's vicinity of each cell. […]

使用C解决矩阵(在CUDA内)

作为一个更大问题的一部分,我需要解决小型线性系统(即NxN,其中N~10),因此使用相关的cuda库在速度方面没有任何意义。 不幸的是,还有一些不清楚的问题是如何在不拉动GSL,EIGEN等大型枪支的情况下解决这些系统问题。 任何人都可以指向直线C中密集矩阵求解器(Ax = B)的方向吗? 对于那些感兴趣的人,这部分代码的生成器的基本结构是: ndarray=some.generator(N,N) for v in range N: B[v]=_F(v)*constant for x in range N: A[v,x]=-_F(v)*ndarray[x,v] 不幸的是,我对高等数学知之甚少,所以任何建议都会受到赞赏。 更新:我一直在努力解决这个问题,并且有一个近乎解决方案,但仍在运行。 任何潜伏的人都欢迎查看我到目前为止在pastebin上的内容 。 我正在使用Crout Decomposition with Pivoting,这似乎是最常用的方法。 这个测试的想法是每个线程都做同样的工作。 无聊我知道,但计划是增加matrixcount变量,放入实际数据,每个线程单独解决小矩阵。 感谢所有正在检查此事的人。 POST-ANSWER UPDATE:完成了CPU和GPU操作的矩阵求解代码,请查看我的懒惰写入

访问cvCreateMatND的元素

我是OpenCV的新手,我正在尝试创建一个n维数组并使用CvMatND访问每个元素。 我可以通过数据[i * step + j * nchannels + 0]访问2D矩阵,如何访问由 int size[] = { 12, 12, 12 }; CvMatND* matB = cvCreateMatND(3, size, CV_8U); int *Data = matA->data.i; 谢谢