0

I am trying to access the results of the eigenvalue decomposition of a general real matrix, using the magma_sgeev routine. My code is as follows -

#include <cstdlib>
#include <iostream>
#include <map>

#include <typeindex>
#include <typeinfo>

#include <magma_v2.h>
#include <random>

#define N 10
#define LDA N
#define LDVL N
#define LDVR N

/* Main program */
int main()
{
    magma_init();
    /* Locals */
    int n = N, lda = LDA, ldvl = LDVL, ldvr = LDVR, info, lwork;
    float wkopt;
    float *work;
    /* Local arrays */
    float wr[N], wi[N], vl[LDVL * N], vr[LDVR * N];
    float *a = (float *)malloc(LDA * N * sizeof(float));
    for (int i = 0; i < LDA * N; i++)
        a[i] = rand();
    printf("Done populating matrix\n");

    lwork = -1;
    magma_sgeev_m(MagmaNoVec, MagmaNoVec, n, a, lda, wr, wi, vl, ldvl, vr, ldvr,
                  work, lwork, &info);

    lwork = (int)work[0];
    work = (float *)malloc(lwork * sizeof(float));
    printf("%d\n", lwork);

    magma_sgeev_m(MagmaNoVec, MagmaNoVec, n, a, lda, wr, wi, vl, ldvl, vr, ldvr,
                  work, lwork, &info);

    for (int i = 0; i < N; i++)
        printf("%f ", wr[i]);

    std::cout << std::endl;

    for (int i = 0; i < N; i++)
        printf("%f ", wi[i]);

    printf("\n");

    if (info > 0)
    {
        printf("The algorithm failed to compute eigenvalues.\n");
        exit(1);
    }
    exit(0);

    magma_finalize();
}

As the documentation says, the arrays wr and wi hold the results of the computation. However, there are two issues with this code,

  • When I try to access the wr and wi, I get a segmentation fault. I am not aware of the inner workings of the magma library, what am I missing, and how do I fix it ?

  • When I increase the size of the matrix, for example from 5x5 to 10x10. I get a segmentation fault in the first call of magma_sgeev itself. What am I missing

talonmies
  • 70,661
  • 34
  • 192
  • 269
Atharva Dubey
  • 832
  • 1
  • 8
  • 25

0 Answers0