当前位置:   article > 正文

利用cublas库函数cublasSgetrfBatched和cublasSgetriBatched求矩阵的逆_cublascgetrfbatched

cublascgetrfbatched

折腾了好几天终于把cublas矩阵求逆调好了,但是依然还是有很多疑问,因为是按照网上别人的程序凑出来的。主要的疑惑有两点,在这里贴出来,希望有大神可以指点一二,大家交流交流。


①矩阵初始化的时候,matHost[0],为什么不可以像我注释掉的那两句那样子初始化,那样初始化的时候就会报错:expected an expression。

②为什么要定义一个在host端的指针srchd,它的内容却在device端,然后又要定义一个device端的指针srcDptr,最后再把srchd拷贝到srcDptr,为什么不能省略掉srchd,直接把srcDptr的内存开辟到device端,把数据从matHost直接拷贝到srcDptr,即

float **srcDptr;

cudaMalloc((void**)&srcDptr, sizeof(float*) * NUM);

for(int I=0;i<NUM;i++)

{

      cudaMalloc((void**)&srcDptr[i],sizeof(float)*N*N);

      cudaMemcpy(srcDptr[i],matHost[i],sizeof(float)*N*N,cudaMemcpyHostToDevice);

}

然后把srcDptr传给cublasSgetrfBatched。

这样我测试是行不通的,不知道是为什么。

③cublasSgetefBatched函数的那个参数pivot到底是什么,是矩阵的各阶顺序主子式吗?因为只有矩阵的各阶顺序主子式都不为0的时候才能进行LU分解,是这样的吗?


下面是我调通的代码:

  1. #include<iostream>
  2. #include"cuda_runtime.h"
  3. #include<cublas_v2.h>
  4. #include<stdlib.h>
  5. #include<time.h>
  6. //矩阵的阶数
  7. #define N 3
  8. //有两个矩阵
  9. #define NUM 2
  10. int main()
  11. {
  12. //开辟一个二维的数组空间
  13. float **matHost = new float*[NUM];
  14. for(int i=0;i<NUM;i++)
  15. matHost[i] = new float[N*N];
  16. //matHost[0] = {-0.997497,0.617481,-0.299417,0.127171,0.170019,
  17. //0.791925,-0.613392,-0.0402539,0.64568};
  18. matHost[0][0] = -0.997497;
  19. matHost[0][1] = 0.617481;
  20. matHost[0][2] = -0.299417;
  21. matHost[0][3] = 0.127171;
  22. matHost[0][4] = 0.170019;
  23. matHost[0][5] = 0.791925;
  24. matHost[0][6] = -0.613392;
  25. matHost[0][7] = -0.0402539;
  26. matHost[0][8] = 0.64568;
  27. //随机初始化矩阵,所有矩阵被初始化成一样的
  28. for(int j=1;j<NUM;j++)
  29. {
  30. for(int i=0;i<N*N;i++)
  31. {
  32. matHost[j][i] = matHost[0][i];
  33. }
  34. }
  35. //指针在host端,内容却在device端
  36. float **srchd = new float*[NUM];
  37. for(int i=0;i<NUM;i++)
  38. {
  39. cudaMalloc((void**)&srchd[i],sizeof(float)*N*N);
  40. cudaMemcpy(srchd[i],matHost[i],sizeof(float)*N*N,cudaMemcpyHostToDevice);
  41. }
  42. float **srcDptr;
  43. cudaMalloc((void**)&srcDptr,sizeof(float*)*NUM);
  44. cudaMemcpy(srcDptr,srchd,sizeof(float*)*NUM,cudaMemcpyHostToDevice);
  45. //用来记录LU分解是否成功,0表示分解成功
  46. int *infoArray;
  47. cudaMalloc((void**)&infoArray,sizeof(int)*NUM);
  48. int *pivotArray;
  49. cudaMalloc((void**)&pivotArray,sizeof(int)*N*NUM);
  50. cublasHandle_t cublasHandle;
  51. cublasCreate(&cublasHandle);
  52. //LU分解,原地的
  53. cublasSgetrfBatched(cublasHandle,N,srcDptr,N,pivotArray,infoArray,NUM);
  54. float **resulthd = new float*[NUM];
  55. for(int i=0;i<NUM;i++)
  56. cudaMalloc((void**)&resulthd[i],sizeof(float)*N*N);
  57. float **resultDptr;
  58. cudaMalloc((void**)&resultDptr,sizeof(float*)*NUM);
  59. cudaMemcpy(resultDptr,resulthd,sizeof(float*)*NUM,cudaMemcpyHostToDevice);
  60. //把LU分解的结果变成逆矩阵
  61. cublasSgetriBatched(cublasHandle,N,(const float**)srcDptr,N,pivotArray,resultDptr,N,infoArray,NUM);
  62. float **invresult = new float*[NUM];
  63. for(int i=0;i<NUM;i++)
  64. {
  65. invresult[i] = new float[N*N];
  66. //注意是resulthd[i]而不是resultDptr[i],否则会出错
  67. cudaMemcpy(invresult[i],resulthd[i],sizeof(float)*N*N,cudaMemcpyDeviceToHost);
  68. }
  69. int *infoArrayHost = new int[NUM];
  70. cudaMemcpy(infoArrayHost,infoArray,sizeof(int)*NUM,cudaMemcpyDeviceToHost);
  71. std::cout<<"info array:"<<std::endl;
  72. for(int i=0;i<NUM;i++)
  73. std::cout<<infoArrayHost[i]<<" ";
  74. std::cout<<std::endl;
  75. cublasDestroy(cublasHandle);
  76. std::cout<<"LU decomposition result:"<<std::endl;
  77. for(int i=0;i<N*N;i++)
  78. {
  79. if(i%N == 0)
  80. std::cout<<std::endl;
  81. std::cout<<invresult[0][i]<<" ";
  82. }
  83. std::cout<<std::endl;
  84. //释放空间
  85. for(int i=0;i<NUM;i++)
  86. {
  87. cudaFree(srchd[i]);
  88. delete []matHost[i];
  89. matHost[i] = NULL;
  90. cudaFree(resulthd[i]);
  91. delete []invresult[i];
  92. invresult[i] = NULL;
  93. }
  94. delete []matHost;
  95. matHost = NULL;
  96. delete []resulthd;
  97. resulthd = NULL;
  98. delete []invresult;
  99. invresult = NULL;
  100. delete []infoArrayHost;
  101. infoArrayHost = NULL;
  102. delete []srchd;
  103. srchd = NULL;
  104. cudaFree(infoArray);
  105. cudaFree(pivotArray);
  106. cudaFree(srcDptr);
  107. cudaFree(resultDptr);
  108. return 0;
  109. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号