在C中访问dgemm

在C中访问dgemm,第1张

概述我需要在C中实现矩阵类,其中一个 *** 作必须是通过dgemm进行矩阵乘法.我的教授在C课堂上做了一个例子,但由于某种原因,我不能让它在C中工作.这是我的头文件matrix.h: #include <iostream>#include <stdlib.h>extern "C" {#include "blas.h"}[blah blah blah, matrix class here; ov 我需要在C中实现矩阵类,其中一个 *** 作必须是通过dgemm进行矩阵乘法.我的教授在C课堂上做了一个例子,但由于某种原因,我不能让它在C中工作.这是我的头文件matrix.h:

#include <iostream>#include <stdlib.h>extern "C" {#include "blas.h"}[blah blah blah,matrix class here; overloaded * operator will do the matrix      multiplication]matrix operator* (const matrix &other){matrix AxB(Nrows,other.Ncolumns,"(" + name + "*" + "other.name" + ")");char TRANSA = 'N';char TRANSB = 'N';int M = Nrows;int N = other.Ncolumns;int K = Ncolumns;double Alpha = 1.;double beta = 0.;dgemm_ (&TRANSA,&TRANSB,&M,&N,&K,&Alpha,data,other.data,&beta,AxB.data,&M);return AxB;[blah blah blah,overloaded = operator here; i'm positive this is not the problem  since it works for matrix addition]

主功能:

#include "matrix.h"main(){// entrIEs of A and B are randomized between 0 and 1matrix A(5,5);matrix B(5,5);matrix C = A*B;}

现在blas.h头文件:

voID dgemm_ (char *TRANSA,char *TRANSB,int *M,int *N,int *K,double *Alpha,double **A,int *LDA,double **B,int *LDB,double *BETA,double **C,int *LDC);

我要使用这里概述的子程序:http://www.netlib.org/blas/dgemm.f

基本上,我们在C类实现它的方式使用(double *)calloc(rows * columns,sizeof(double))将矩阵构建为一个长数组.

我的C实现做了:

double **data;data = new double[rows];for(int i=1; i<=rows; ++i){    data[i-1] = new double[columns];}

然后我可以使用data [i] [j]进行索引.但由于dgemm子程序应该采用double * A,double * B等,但我的矩阵是双** A等等,我该如何解决这个问题?

这是我从valgrind得到的错误消息:

==18845== InvalID write of size 8==18845==    at 0x4165C1C: ATL_dgezero (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4149DA7: ATL_dNCmmJIK (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x415BE8E: ATL_dgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4182F54: ATL_dptgemm_nt (in /usr/lib/atlas-base/atlas   /libblas.so.3gf.0)==18845==    by 0x4183140: ATL_dptgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x40818F6: atl_f77wrap_dgemm_ (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4E4E0004: ???==18845==  Address 0x478d680 is 8 bytes after a block of size 16 alloc'd==18845==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind   /vgpreload_memcheck-x86-linux.so)==18845==    by 0x8049045: dmatrix::dmatrix(int,int,std::string) (dmatrix.hpp:77)==18845==    by 0x8049532: dmatrix::operator*(dmatrix const&) (dmatrix.hpp:218)==18845==    by 0x8048DCB: main (main.cpp:17)==18845== ==18845== InvalID write of size 8==18845==    at 0x4165C1F: ATL_dgezero (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4149DA7: ATL_dNCmmJIK (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x415BE8E: ATL_dgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4182F54: ATL_dptgemm_nt (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4183140: ATL_dptgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x40818F6: atl_f77wrap_dgemm_ (in /usr/lib/atlas-base/atlas   /libblas.so.3gf.0)==18845==    by 0x4E4E0004: ???==18845==  Address 0x478d678 is 0 bytes after a block of size 16 alloc'd==18845==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind /vgpreload_memcheck-x86-linux.so)==18845==    by 0x8049045: dmatrix::dmatrix(int,std::string) (dmatrix.hpp:77)==18845==    by 0x8049532: dmatrix::operator*(dmatrix const&) (dmatrix.hpp:218)==18845==    by 0x8048DCB: main (main.cpp:17)==18845== ==18845== InvalID write of size 8==18845==    at 0x4165C22: ATL_dgezero (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4149DA7: ATL_dNCmmJIK (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x415BE8E: ATL_dgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4182F54: ATL_dptgemm_nt (in /usr/lib/atlas-base/atlas    /libblas.so.3gf.0)==18845==    by 0x4183140: ATL_dptgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x40818F6: atl_f77wrap_dgemm_ (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4E4E0004: ???==18845==  Address 0x478d690 is not stack'd,malloc'd or (recently) free'd==18845== ==18845== InvalID write of size 8 ==18845==    at 0x4165C25: ATL_dgezero (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4149DA7: ATL_dNCmmJIK (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x415BE8E: ATL_dgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4182F54: ATL_dptgemm_nt (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4183140: ATL_dptgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x40818F6: atl_f77wrap_dgemm_ (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4E4E0004: ???==18845==  Address 0x478d688 is not stack'd,malloc'd or (recently) free'd==18845== ==18845== InvalID read of size 8==18845==    at 0x4143D60: ATL_dJIK0x0x0NN0x0x0_aX_bX (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4149A9D: ATL_dNCmmJIK (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x415BE8E: ATL_dgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4182F54: ATL_dptgemm_nt (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4183140: ATL_dptgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x40818F6: atl_f77wrap_dgemm_ (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4E4E0004: ???==18845==  Address 0x478cf80 is not stack'd,malloc'd or (recently) free'd==18845== ==18845== InvalID read of size 8==18845==    at 0x4143D64: ATL_dJIK0x0x0NN0x0x0_aX_bX (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4149A9D: ATL_dNCmmJIK (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x415BE8E: ATL_dgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4182F54: ATL_dptgemm_nt (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4183140: ATL_dptgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x40818F6: atl_f77wrap_dgemm_ (in /usr/lib/atlas-base/atlas    /libblas.so.3gf.0)==18845==    by 0x4E4E0004: ???==18845==  Address 0x478d130 is 0 bytes after a block of size 16 alloc'd==18845==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind /vgpreload_memcheck-x86-linux.so)==18845==    by 0x8049045: dmatrix::dmatrix(int,std::string) (dmatrix.hpp:77)==18845==    by 0x8048D49: main (main.cpp:6)==18845== ==18845== InvalID read of size 8 ==18845==    at 0x4143D4C: ATL_dJIK0x0x0NN0x0x0_aX_bX (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4149A9D: ATL_dNCmmJIK (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x415BE8E: ATL_dgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4182F54: ATL_dptgemm_nt (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4183140: ATL_dptgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x40818F6: atl_f77wrap_dgemm_ (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4E4E0004: ???==18845==  Address 0x478d678 is 0 bytes after a block of size 16 alloc'd==18845==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind /vgpreload_memcheck-x86-linux.so)==18845==    by 0x8049045: dmatrix::dmatrix(int,std::string) (dmatrix.hpp:77)==18845==    by 0x8049532: dmatrix::operator*(dmatrix const&) (dmatrix.hpp:218)==18845==    by 0x8048DCB: main (main.cpp:17)==18845== ==18845== InvalID write of size 8==18845==    at 0x4143D93: ATL_dJIK0x0x0NN0x0x0_aX_bX (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4149A9D: ATL_dNCmmJIK (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x415BE8E: ATL_dgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x4182F54: ATL_dptgemm_nt (in /usr/lib/atlas-base/atlas /libblas.so.3gf.0)==18845==    by 0x4183140: ATL_dptgemm (in /usr/lib/atlas-base/atlas/libblas.so.3gf.0)==18845==    by 0x40818F6: atl_f77wrap_dgemm_ (in /usr/lib/atlas-base/atlas   /libblas.so.3gf.0)==18845==    by 0x4E4E0004: ???==18845==  Address 0x478d678 is 0 bytes after a block of size 16 alloc'd==18845==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind /vgpreload_memcheck-x86-linux.so)==18845==    by 0x8049045: dmatrix::dmatrix(int,std::string) (dmatrix.hpp:77)==18845==    by 0x8049532: dmatrix::operator*(dmatrix const&) (dmatrix.hpp:218)==18845==    by 0x8048DCB: main (main.cpp:17)==18845== ==18845== InvalID read of size 8==18845==    at 0x8048DEA: main (main.cpp:19)==18845==  Address 0x0 is not stack'd,malloc'd or (recently) free'd==18845== ==18845== ==18845== Process terminating with default action of signal 11 (SIGSEGV)==18845==  Access not within mapped region at address 0x0==18845==    at 0x8048DEA: main (main.cpp:19)==18845==  If you belIEve this happened as a result of a stack==18845==  overflow in your program's main thread (unlikely but==18845==  possible),you can try to increase the size of the==18845==  main thread stack using the --main-stacksize= flag.==18845==  The main thread stack size used in this run was 8388608.==18845== ==18845== HEAP SUMMARY:==18845==     in use at exit: 3,581 bytes in 39 blocks==18845==   total heap usage: 49 allocs,10 frees,7,760 bytes allocated==18845== ==18845== LEAK SUMMARY:==18845==    definitely lost: 128 bytes in 4 blocks==18845==    indirectly lost: 0 bytes in 0 blocks==18845==      possibly lost: 88 bytes in 4 blocks==18845==    still reachable: 3,365 bytes in 31 blocks==18845==         suppressed: 0 bytes in 0 blocks==18845== Rerun with --leak-check=full to see details of leaked memory==18845== ==18845== For counts of detected and suppressed errors,rerun with: -v==18845== ERROR SUMMARY: 111 errors from 9 contexts (suppressed: 0 from 0)Segmentation fault (core dumped)

直到我尝试实现dgemm矩阵乘法,我没有错误和没有泄漏,所以我很确定我的所有麻烦都在于dgemm实现

解决方法 C版本的内存布局与C版本中的内存布局不同.由于BLAS期望C版本使用的布局类型,因此您的C版本将无法正常工作.

因此,您需要在C版本中分配一个大的1-D数组;你可以重载operator()以获得2D数组的索引.或者对于生产代码,请使用诸如Eigen之类的库.

总结

以上是内存溢出为你收集整理的在C中访问dgemm全部内容,希望文章能够帮你解决在C中访问dgemm所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存