magma with MKL in same project will make int to __int64
Posted: Wed Mar 08, 2017 10:08 am
Hi All:
I am trying to put MKL pardiso and magma matrix solver in the same project.
When I create a project only with magma it working fine.
After I put MKL pardiso and magma in to same project and trying to copy my csr matrix to "magma_d_matrix" struct
The program always crash in "magma_d_solver" function.
I do some trouble shutting, I see the different,
When project working with MKL pardiso and magma,
the struct attribute like magma_d_matrix.num_rows should be int but it has be changed to "__int64".
I think that is the cause why my program crash.
My question is, can I avoid this issue by doing some config ? or magma just cannot working with MKL in the same project?
fallowing is my source code
I am link fallowing library
Have a good day.
AlarmChang.
I am trying to put MKL pardiso and magma matrix solver in the same project.
When I create a project only with magma it working fine.
After I put MKL pardiso and magma in to same project and trying to copy my csr matrix to "magma_d_matrix" struct
The program always crash in "magma_d_solver" function.
I do some trouble shutting, I see the different,
When project working with MKL pardiso and magma,
the struct attribute like magma_d_matrix.num_rows should be int but it has be changed to "__int64".
I think that is the cause why my program crash.
My question is, can I avoid this issue by doing some config ? or magma just cannot working with MKL in the same project?
fallowing is my source code
Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "mkl_pardiso.h"
#include "mkl_types.h"
#include "magma_v2.h"
#include "magmasparse.h"
#include "testings.h"
int main(void)
{
/* Matrix data. */
MKL_INT n = 8;
MKL_INT ia[9] = { 0, 4, 7, 9, 11, 14, 16, 17, 18 };
MKL_INT ja[18] =
{ 0, 2, 5, 6,
1, 2, 4,
2, 7,
3, 6,
4, 5, 6,
5, 7,
6,
7
};
double a[18] =
{ 7.0, 1.0, 2.0, 7.0,
-4.0, 8.0, 2.0,
1.0, 5.0,
7.0, 9.0,
5.0, 1.0, 5.0,
-1.0, 5.0,
11.0,
5.0
};
MKL_INT mtype = -2; /* Real symmetric matrix */
/* RHS and solution vectors. */
double b[8], x[8];
MKL_INT nrhs = 1; /* Number of right hand sides. */
/* Internal solver memory pointer pt, */
/* 32-bit: int pt[64]; 64-bit: long int pt[64] */
/* or void *pt[64] should be OK on both architectures */
void *pt[64];
/* Pardiso control parameters. */
MKL_INT iparm[64];
MKL_INT maxfct, mnum, phase, error, msglvl;
/* Auxiliary variables. */
MKL_INT i;
double ddum; /* Double dummy */
MKL_INT idum; /* Integer dummy. */
/* -------------------------------------*/
/* .. Setup Pardiso control parameters. */
/* -------------------------------------*/
for (i = 0; i < 64; i++)
{
iparm[i] = 0;
}
iparm[0] = 1; /* No solver default */
iparm[1] = 2; /* Fill-in reordering from METIS */
iparm[3] = 0; /* No iterative-direct algorithm */
iparm[4] = 0; /* No user fill-in reducing permutation */
iparm[5] = 0; /* Write solution into x */
iparm[7] = 2; /* Max numbers of iterative refinement steps */
iparm[9] = 13; /* Perturb the pivot elements with 1E-13 */
iparm[10] = 1; /* Use nonsymmetric permutation and scaling MPS */
iparm[12] = 0; /* Maximum weighted matching algorithm is switched-off (default for symmetric). Try iparm[12] = 1 in case of inappropriate accuracy */
iparm[13] = 0; /* Output: Number of perturbed pivots */
iparm[17] = -1; /* Output: Number of nonzeros in the factor LU */
iparm[18] = -1; /* Output: Mflops for LU factorization */
iparm[19] = 0; /* Output: Numbers of CG Iterations */
iparm[34] = 1; /* PARDISO use C-style indexing for ia and ja arrays */
maxfct = 1; /* Maximum number of numerical factorizations. */
mnum = 1; /* Which factorization to use. */
msglvl = 1; /* Print statistical information in file */
error = 0; /* Initialize error flag */
/* ----------------------------------------------------------------*/
/* .. Initialize the internal solver memory pointer. This is only */
/* necessary for the FIRST call of the PARDISO solver. */
/* ----------------------------------------------------------------*/
for (i = 0; i < 64; i++)
{
pt[i] = 0;
}
magma_int_t info = 0;
TESTING_CHECK(magma_init());
magma_print_environment();
magma_dopts zopts;
magma_queue_t queue;
magma_queue_create(0, &queue);
magma_d_matrix A = { Magma_CSR };
//zopts.solver_par.solver = Magma_GMRES;
//zopts.solver_par.solver = Magma_CG;
//zopts.solver_par.solver = Magma_PIDRMERGE;
zopts.solver_par.solver = Magma_BICGSTAB;
zopts.solver_par.restart = 8;
zopts.solver_par.maxiter = 1000;
zopts.solver_par.rtol = 1e-10;
zopts.solver_par.maxiter = 1000;
zopts.precond_par.solver = Magma_ILU;
//zopts.precond_par.solver = Magma_JACOBI;
zopts.precond_par.levels = 0;
zopts.precond_par.trisolver = Magma_CUSOLVE;
int nn = 8;
int iaa[9] = { 0, 4, 7, 9, 11, 14, 16, 17, 18 };//zero base
int jaa[18] = { 0, 2, 5, 6, 1, 2, 4, 2, 7, 3, 6, 4, 5, 6, 5, 7, 6, 7 };//zero base
//int ia[9] = { 1, 5, 8, 10, 12, 15, 17, 18, 19 };
//int ja[18] = { 1, 3, 6, 7, 2, 3, 5, 3, 8, 4, 7, 5, 6, 7, 6, 8, 7, 8};
double aa[18] = { 7.0, 1.0, 2.0, 7.0, -4.0, 8.0, 2.0, 1.0, 5.0, 7.0, 9.0, 5.0, 1.0, 5.0, -1.0, 5.0, 11.0, 5.0 };
double h_b[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }, h_x[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
TESTING_CHECK(magma_dsolverinfo_init(&zopts.solver_par, &zopts.precond_par, queue));
magma_dcsrset(nn, nn, &iaa[0], &jaa[0], aa, &A, queue);
/* --------------------------------------------------------------------*/
/* .. Reordering and Symbolic Factorization. This step also allocates */
/* all memory that is necessary for the factorization. */
/* --------------------------------------------------------------------*/
phase = 11;
PARDISO(pt, &maxfct, &mnum, &mtype, &phase,
&n, a, ia, ja, &idum, &nrhs, iparm, &msglvl, &ddum, &ddum, &error);
if (error != 0)
{
printf("\nERROR during symbolic factorization: %d", error);
exit(1);
}
printf("\nReordering completed ... ");
printf("\nNumber of nonzeros in factors = %d", iparm[17]);
printf("\nNumber of factorization MFLOPS = %d", iparm[18]);
/* ----------------------------*/
/* .. Numerical factorization. */
/* ----------------------------*/
phase = 22;
PARDISO(pt, &maxfct, &mnum, &mtype, &phase,
&n, a, ia, ja, &idum, &nrhs, iparm, &msglvl, &ddum, &ddum, &error);
if (error != 0)
{
printf("\nERROR during numerical factorization: %d", error);
exit(2);
}
printf("\nFactorization completed ... ");
/* -----------------------------------------------*/
/* .. Back substitution and iterative refinement. */
/* -----------------------------------------------*/
phase = 33;
iparm[7] = 2; /* Max numbers of iterative refinement steps. */
/* Set right hand side to one. */
for (i = 0; i < n; i++)
{
b[i] = 1;
}
PARDISO(pt, &maxfct, &mnum, &mtype, &phase,
&n, a, ia, ja, &idum, &nrhs, iparm, &msglvl, b, x, &error);
if (error != 0)
{
printf("\nERROR during solution: %d", error);
exit(3);
}
printf("\nSolve completed ... ");
printf("\nThe solution of the system is: ");
for (i = 0; i < n; i++)
{
printf("\n x [%d] = % f", i, x[i]);
}
printf("\n");
/* --------------------------------------*/
/* .. Termination and release of memory. */
/* --------------------------------------*/
phase = -1; /* Release internal memory. */
PARDISO(pt, &maxfct, &mnum, &mtype, &phase,
&n, &ddum, ia, ja, &idum, &nrhs,
iparm, &msglvl, &ddum, &ddum, &error);
return 0;
}
Code: Select all
mkl_scalapack_ilp64_dll.lib
mkl_cdft_core_dll.lib
mkl_intel_ilp64_dll.lib
mkl_intel_thread_dll.lib
mkl_core_dll.lib
mkl_blacs_ilp64_dll.lib
libiomp5md.lib
C:\work\magma\OpenBLAS-v0.2.19-Win64-int32\lib\libopenblas.dll.a
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cudart.lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cublas.lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cublas_device.lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cusparse.lib
C:\work\magma\build\lib\Debug\magma.lib
C:\work\magma\build\lib\Debug\magma_sparse.lib
C:\work\magma\build\lib\Debug\lapacktest.lib
C:\work\magma\build\lib\Debug\tester.lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cudart_static.lib
Have a good day.
AlarmChang.