【问题标题】:CSCMM for Armadillo Sparse dense multiplications用于犰狳稀疏密集乘法的 CSCMM
【发布时间】:2014-09-16 02:21:50
【问题描述】:

环境:犰狳 4.320.0 和 4.400
编译器:英特尔 CPP 编译器
操作系统:Ubuntu 12.04

我正在尝试用英特尔 MKL 的 CSCMM 调用替换犰狳的原生稀疏密集乘法。我写了以下代码。

#include <mkl.h>  
#define ARMA_64BIT_WORD
#include <armadillo>

using namespace std;
using namespace arma;

int  main(int argc, char *argv[])
{
   long long m = atoi(argv[1]);
   long long k = atoi(argv[2]);
   long long n = atoi(argv[3]);
   float density = 0.3;
   sp_fmat A = sprandn<sp_fmat>(m,k,density);
   fmat B = randu<fmat>(k,n);
   fmat C(m,n);
   C.zeros();
 //C = alpha * A * B + beta * C;
 //mkl_scscmm (char *transa, MKL_INT *m, MKL_INT *n, MKL_INT *k, float *alpha, char *matdescra,       
 //float *val, MKL_INT *indx, MKL_INT *pntrb, MKL_INT *pntre, float *b, MKL_INT *ldb, float *beta, 
//float *c, MKL_INT *ldc);
  char transa = 'N';
  float alpha = 1.0;
  float beta = 0.0;
  char* matdescra = "GUUC";
  long long ldb = k;
  long long ldc = m;
  cout << "b4 Input A:" << endl << A;
  cout << "b4 Input B:" << endl << B;
  mkl_scscmm (&transa,&m,&n,&k,&alpha,matdescra,
              const_cast<float *>(A.values), (long long *)A.row_indices,
             (long long *)A.col_ptrs,(long long *)(A.col_ptrs + 1),
             B.memptr(),&ldb,
             &beta, C, &ldc);
  cout << "Input A:" << endl << A;
  cout << "Input B:" << endl << B;
  cout << "Input C:" << endl << C;
  return 0;
}

我编译了上面的代码并将其运行为“./testcscmm 10 4 6”。我遇到分段错误(核心转储)。

[矩阵大小:10x4; n_nonzero:12;密度:30.00%]

 (0, 0)         1.1123
 (4, 0)        -0.3453
 (8, 0)         0.6081
 (1, 1)         0.6410
 (4, 1)        -0.7121
 (5, 1)         1.1592
 (9, 1)        -1.7189
 (0, 2)         0.4175
 (2, 2)        -0.4001
 (4, 2)         2.2809
 (4, 3)        -2.2717
 (9, 3)         0.2251

b4 Input B:
0.1567   0.9989   0.6126   0.4936   0.5267   0.2833
0.4009   0.2183   0.2960   0.9728   0.7699   0.3525
0.1298   0.5129   0.6376   0.2925   0.4002   0.8077
0.1088   0.8391   0.5243   0.7714   0.8915   0.9190
Input A:
[matrix size: 13715672716573367337x13744746204899078486; n_nonzero: 12; density: 0.00%]

Segmentation fault (core dumped)

由于某种原因,A 的结构被破坏了。我有以下问题。

  1. MKL_CSCMM 是否修改输入数组?如果不是,为什么 A 会损坏?
  2. 我将矩阵 C 更改为原生浮点数。错误仍然存​​在。
  3. Valgrind 显示一些内存错误。

让我知道如何使用 Armadillo 的矩阵数据结构进行英特尔 MKL 调用。特别是稀疏密集乘法。

【问题讨论】:

    标签: armadillo intel-mkl


    【解决方案1】:

    Libarmadillo 库也必须与 mkl_ilp64 而不是 mkl_lp64 链接。请按照以下说明进行操作。

    建造和安装犰狳:

    • 导出 CXX=icpc
    • 导出 CC=icpc
    • 导出 PATH=$PATH:/home/ramki/intel/bin:
    • 编辑 $armadillo_root/cmake_aux/Modules/ARMA_FindMKL.cmake,正确包含路径。
    • 编辑 $armadillo_root/cmake_aux/Modules/ARMA_FindMKL.cmake,将 mkl_lp64 更改为 mkl_ilp64
    • 编辑 $armadillo_root/CMakeLists.txt 并 (1) 更改 CMAKE_SHARED_LINKER_FLAGS 以包含英特尔链接顾问的链接行和 (2) 更改英特尔链接顾问给出的 CMAKE_CXX_FLAGS
    • 运行 ./configure 并确保 MKL 库用于 blas 和 lapack,icpc 作为编译器,其余的都可以。
    • 运行 make 。
    • 通过运行 ldd libarmadillo.so 来验证链接库。主要验证是否与mkl_ilp64库和mkl blas和lapack库链接。
    • 现在运行 make install DESTDIR=local path。

    在 C++ 程序中

    • 不要使用 const_cast 函数将 A.values 的 const ptr 大小写为 ptr A.values。它扭曲了指针,并且不确定我们是否将正确的指针传递给 cscmm。而是将 A 的值单独复制到一个单独的数组中。
    • 确保您设置了正确的 ldb 和 ldc。
    • pntrb 和 pntre 可以是 A.col_ptrs 和 A.col_ptrs+1。
    • 使用 MKL_INT 代替 long long。

    希望这对每个人都有帮助。

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      相关资源
      最近更新 更多