<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://e6.ijs.si/medusa/wiki/index.php?action=history&amp;feed=atom&amp;title=Pardiso</id>
		<title>Pardiso - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://e6.ijs.si/medusa/wiki/index.php?action=history&amp;feed=atom&amp;title=Pardiso"/>
		<link rel="alternate" type="text/html" href="http://e6.ijs.si/medusa/wiki/index.php?title=Pardiso&amp;action=history"/>
		<updated>2026-05-02T15:54:06Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.27.1</generator>

	<entry>
		<id>http://e6.ijs.si/medusa/wiki/index.php?title=Pardiso&amp;diff=1223&amp;oldid=prev</id>
		<title>Mdepolli: /* Pardiso library */</title>
		<link rel="alternate" type="text/html" href="http://e6.ijs.si/medusa/wiki/index.php?title=Pardiso&amp;diff=1223&amp;oldid=prev"/>
				<updated>2017-07-19T13:19:31Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Pardiso library&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 13:19, 19 July 2017&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l5&quot; &gt;Line 5:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 5:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Pardiso is proprietary software but is available for academic use; by registering a yearly license can be obtained.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Pardiso is proprietary software but is available for academic use; by registering a yearly license can be obtained.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Parallelization is implemented using both OpenMP and MPI.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Parallelization is implemented using both OpenMP and MPI.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* MPI-based numerical factorization and parallel forward/backward substitution on distributed-memory architectures is implemented for '''symmetric indefinite matrices'''.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Example of use==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Example of use==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Mdepolli</name></author>	</entry>

	<entry>
		<id>http://e6.ijs.si/medusa/wiki/index.php?title=Pardiso&amp;diff=1222&amp;oldid=prev</id>
		<title>Mdepolli: Created page with &quot;=Pardiso library=  Pardiso library can be downloaded from [http://www.pardiso-project.org/]. There are also examples of use, the manual, etc. Note that the source of the libra...&quot;</title>
		<link rel="alternate" type="text/html" href="http://e6.ijs.si/medusa/wiki/index.php?title=Pardiso&amp;diff=1222&amp;oldid=prev"/>
				<updated>2017-07-19T11:21:00Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;=Pardiso library=  Pardiso library can be downloaded from [http://www.pardiso-project.org/]. There are also examples of use, the manual, etc. Note that the source of the libra...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Pardiso library=&lt;br /&gt;
&lt;br /&gt;
Pardiso library can be downloaded from [http://www.pardiso-project.org/]. There are also examples of use, the manual, etc. Note that the source of the library is not available. There are only pre-compiled objects available on download after one registers on the site.&lt;br /&gt;
* The package PARDISO is a thread-safe, high-performance, robust, memory efficient and easy to use software for solving large sparse symmetric and unsymmetric linear systems of equations on shared-memory and distributed-memory multiprocessors. The solver uses a combination of left- and right-looking Level-3 BLAS supernode techniques&amp;quot;. &lt;br /&gt;
* Pardiso is proprietary software but is available for academic use; by registering a yearly license can be obtained.&lt;br /&gt;
* Parallelization is implemented using both OpenMP and MPI.&lt;br /&gt;
&lt;br /&gt;
==Example of use==&lt;br /&gt;
&lt;br /&gt;
This minimal example makes use of the OpenMP parallelization to run Pardiso solver on a sample matrix. &lt;br /&gt;
&lt;br /&gt;
test.cpp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;cassert&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// PARDISO prototype.&lt;br /&gt;
// There is no pardiso.h, therefore function prototypes have to be defined within the user's code&lt;br /&gt;
extern &amp;quot;C&amp;quot; void pardisoinit (void   *, int    *,   int *, int *, double *, int *);&lt;br /&gt;
extern &amp;quot;C&amp;quot; void pardiso     (void   *, int    *,   int *, int *,    int *, int *, &lt;br /&gt;
                  double *, int    *,    int *, int *,   int *, int *,&lt;br /&gt;
                     int *, double *, double *, int *, double *);&lt;br /&gt;
extern &amp;quot;C&amp;quot; void pardiso_chkmatrix  (int *, int *, double *, int *, int *, int *);&lt;br /&gt;
extern &amp;quot;C&amp;quot; void pardiso_chkvec     (int *, int *, double *, int *);&lt;br /&gt;
extern &amp;quot;C&amp;quot; void pardiso_printstats (int *, int *, double *, int *, int *, int *, double *, int *);&lt;br /&gt;
&lt;br /&gt;
struct TestCase {&lt;br /&gt;
    // the dimension of the problem, Matrix A will have n*n elements, while vectors b and x will have n elements&lt;br /&gt;
    int n;&lt;br /&gt;
    // indices of individual rows in compact matrix definition: row[0] contains non zero elements at column indices ia[0] .. (ia[1]-1)&lt;br /&gt;
    std::vector&amp;lt;int&amp;gt; ia;&lt;br /&gt;
    // column indices of non-zero elements&lt;br /&gt;
    std::vector&amp;lt;int&amp;gt; ja;&lt;br /&gt;
    // values of non-zero elements&lt;br /&gt;
    std::vector&amp;lt;double&amp;gt; A;&lt;br /&gt;
    // right hand side&lt;br /&gt;
    std::vector&amp;lt;double&amp;gt; b;&lt;br /&gt;
    // solution vector&lt;br /&gt;
    std::vector&amp;lt;double&amp;gt; x;&lt;br /&gt;
&lt;br /&gt;
    // Pardiso workspace variable (using void* as the type ensures enough space is allocated on 32 and 64-bit systems)&lt;br /&gt;
    void*    pt[64];&lt;br /&gt;
    // Pardiso solver parameter variables&lt;br /&gt;
    int      iparm[64];&lt;br /&gt;
    double   dparm[64];&lt;br /&gt;
    &lt;br /&gt;
    void createTestMatrix(int n) {&lt;br /&gt;
        this-&amp;gt;n = n;&lt;br /&gt;
        &lt;br /&gt;
        // -2 on the diagonal (except topmost and bottommost, which are 1), 1 on the +1 and -1 diagonals (except topmost and bottommost, which are 0)&lt;br /&gt;
        ia.reserve(n*2);&lt;br /&gt;
        ja.reserve(n*3);&lt;br /&gt;
        A.reserve(n*3);  // 3 per row&lt;br /&gt;
        &lt;br /&gt;
        // 1st row (only 1 element)&lt;br /&gt;
        ia.push_back(0);&lt;br /&gt;
        A.push_back(1);&lt;br /&gt;
        ja.push_back(0);&lt;br /&gt;
&lt;br /&gt;
        for (int i = 1; i &amp;lt; n-1; ++i) {&lt;br /&gt;
            // new row is stating&lt;br /&gt;
            ia.push_back(A.size());&lt;br /&gt;
            &lt;br /&gt;
            // the 3 diagonal elements&lt;br /&gt;
            A.push_back(1);&lt;br /&gt;
            ja.push_back(i-1);&lt;br /&gt;
            &lt;br /&gt;
            A.push_back(-2);&lt;br /&gt;
            ja.push_back(i);&lt;br /&gt;
            &lt;br /&gt;
            A.push_back(1);&lt;br /&gt;
            ja.push_back(i+1);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // last row (only 1 element)&lt;br /&gt;
        ia.push_back(A.size());&lt;br /&gt;
        A.push_back(1);&lt;br /&gt;
        ja.push_back(n-1);&lt;br /&gt;
        &lt;br /&gt;
        // the last element points at the end of the matrix (n+1 row)&lt;br /&gt;
        ia.push_back(A.size());&lt;br /&gt;
        &lt;br /&gt;
        // Convert matrix from 0-based to 1-based notation (Fortran...)&lt;br /&gt;
        for (auto i = 0; i &amp;lt; ia.size(); i++) &lt;br /&gt;
            ia[i] += 1;&lt;br /&gt;
        for (auto i = 0; i &amp;lt; ja.size(); i++) &lt;br /&gt;
            ja[i] += 1;&lt;br /&gt;
            &lt;br /&gt;
        // set b to 1 (topmost and bottommost elements) and 1/n² (the other elements)&lt;br /&gt;
        b.resize(n, 1);&lt;br /&gt;
        for (auto i = 0; i &amp;lt; b.size(); i++) &lt;br /&gt;
            b[i] /= (n*n);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void solve(int numThreads) {&lt;br /&gt;
        // the solution placeholder&lt;br /&gt;
        x.resize(n, 0);&lt;br /&gt;
        &lt;br /&gt;
        int error = 0;&lt;br /&gt;
        int solver = 0;     // use sparse direct solver&lt;br /&gt;
        int maxfct, mnum, phase, msglvl;&lt;br /&gt;
        int mtype = 11;     // Real unsymmetric matrix&lt;br /&gt;
        double ddum;        // double dummy variable&lt;br /&gt;
        int idum;           // integer dummy variable&lt;br /&gt;
        int nrhs = 1;       // number of right hand sides&lt;br /&gt;
        maxfct = 1;         // Maximum number of numerical factorizations.&lt;br /&gt;
        mnum   = 1;         // Which factorization to use.&lt;br /&gt;
        msglvl = 1;         // Print statistical information&lt;br /&gt;
        error  = 0;         // Initialize error flag to no-error&lt;br /&gt;
        iparm[2] = numThreads;  // initialize the number of threads &lt;br /&gt;
        &lt;br /&gt;
        pardisoinit (pt,  &amp;amp;mtype, &amp;amp;solver, iparm, dparm, &amp;amp;error);&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;error = &amp;quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
        pardiso_chkmatrix  (&amp;amp;mtype, &amp;amp;n, A.data(), ia.data(), ja.data(), &amp;amp;error);&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;error = &amp;quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
        pardiso_chkvec (&amp;amp;n, &amp;amp;nrhs, b.data(), &amp;amp;error);&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;error = &amp;quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
        pardiso_printstats (&amp;amp;mtype, &amp;amp;n, A.data(), ia.data(), ja.data(), &amp;amp;nrhs, b.data(), &amp;amp;error);&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;error = &amp;quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
   &lt;br /&gt;
        phase = 11;     // reordering &amp;amp; symbolic factorization&lt;br /&gt;
        pardiso (pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, A.data(), ia.data(), ja.data(), &amp;amp;idum, &amp;amp;nrhs, iparm, &amp;amp;msglvl, &amp;amp;ddum, &amp;amp;ddum, &amp;amp;error, dparm); &lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;error = &amp;quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
        phase = 22;     // numerical factorization&lt;br /&gt;
        pardiso (pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, A.data(), ia.data(), ja.data(), &amp;amp;idum, &amp;amp;nrhs, iparm, &amp;amp;msglvl, &amp;amp;ddum, &amp;amp;ddum, &amp;amp;error, dparm);&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;error = &amp;quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
        phase = 33;     // back substitution and refinement&lt;br /&gt;
        iparm[7] = 10;  // number of refinement steps&lt;br /&gt;
        pardiso (pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, A.data(), ia.data(), ja.data(), &amp;amp;idum, &amp;amp;nrhs, iparm, &amp;amp;msglvl, b.data(), x.data(), &amp;amp;error, dparm);&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;error = &amp;quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
        phase = -1;     // finalization and memory release&lt;br /&gt;
        pardiso (pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, A.data(), ia.data(), ja.data(), &amp;amp;idum, &amp;amp;nrhs, iparm, &amp;amp;msglvl, b.data(), x.data(), &amp;amp;error, dparm);&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;error = &amp;quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    assert(argc == 2 &amp;amp;&amp;amp; &amp;quot;Second argument is size of the system.&amp;quot;);&lt;br /&gt;
    int n, nThreads;&lt;br /&gt;
    std::stringstream ss(argv[1]);&lt;br /&gt;
    ss &amp;gt;&amp;gt; n;&lt;br /&gt;
    auto omp_num_threads = getenv(&amp;quot;OMP_NUM_THREADS&amp;quot;);&lt;br /&gt;
    if (omp_num_threads != nullptr) {&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;OMP_NUM_THREADS = &amp;quot; &amp;lt;&amp;lt; omp_num_threads &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
        nThreads = atoi(omp_num_threads);      // number of threads&lt;br /&gt;
    }&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;n = &amp;quot; &amp;lt;&amp;lt; n &amp;lt;&amp;lt; &amp;quot;, num threads = &amp;quot; &amp;lt;&amp;lt; nThreads &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    &lt;br /&gt;
    TestCase testcase;&lt;br /&gt;
    testcase.createTestMatrix(n);&lt;br /&gt;
    testcase.solve(nThreads);&lt;br /&gt;
    return 0;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code is compiled with GCC using the following command line: &lt;br /&gt;
&amp;lt;code&amp;gt;g++ test.cpp -o test -O3 -L./ -lpardiso500-GNU481-X86-64 -lgfortran -fopenmp -lpthread -lm -llapack -lblas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then it is executed:&lt;br /&gt;
&amp;lt;code&amp;gt;OMP_NUM_THREADS=8 ./test 1000000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This takes quite some time on the experimental machine (Intel i7 870 @ 2.93 GHz), which is dilligently reported by Pardiso itself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Summary PARDISO 5.0.0: ( reorder to reorder )&lt;br /&gt;
    Time fulladj: 0.054887 s&lt;br /&gt;
    Time reorder: 2.192858 s&lt;br /&gt;
    Time symbfct: 0.189367 s&lt;br /&gt;
    Time parlist: 0.059304 s&lt;br /&gt;
    Time malloc : 0.122711 s&lt;br /&gt;
    Time total  : 2.871472 s total - sum: 0.252344 s&lt;br /&gt;
Summary PARDISO 5.0.0: ( factorize to factorize )&lt;br /&gt;
    Time A to LU: 0.000000 s&lt;br /&gt;
    Time numfct : 0.196008 s&lt;br /&gt;
    Time malloc : -0.000004 s&lt;br /&gt;
    Time total  : 0.196070 s total - sum: 0.000066 s&lt;br /&gt;
Summary PARDISO 5.0.0: ( solve to solve )&lt;br /&gt;
    Time solve  : 0.033254 s&lt;br /&gt;
    Time total  : 0.200364 s total - sum: 0.167110 s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdepolli</name></author>	</entry>

	</feed>