flame / libflame

High-performance object-based library for DLA computations
Other
235 stars 83 forks source link

Puzzles about using FLASH_LU_piv #91

Open FuncJ opened 1 year ago

FuncJ commented 1 year ago

Hi, I want to utilize the function 'FLASH_lu_piv' to perform a LU factorization. But I have met a NULL pointer error. This error could be my mistake for misunderstanding the usage of the function.

int main( void ) { // matrix parameters: A, column major int N; // test parameters int N_START, N_END, INC, REPEAT;

printf("[INPUT]: input N_START, N_END, INC, REPEAT\n");
if(scanf("%d %d %d %d", &N_START, &N_END, &INC, &REPEAT) == 4){
    printf("[TRUE]: true parameters for scanf\n");
}
else{
    fprintf(stderr, "[ERROR]: false parameters for scanf\n");
    exit(EXIT_FAILURE);
}

// Initialize libflame.
FLA_Init();

// N, REPEAT
N = N_START;
while (N <= N_END){
    for(int re_count = 0; re_count < REPEAT; ++ re_count){
            dim_t blocksize = 40, depth = 1;

            FLA_Obj IPIV;
            FLA_Obj_create( FLA_INT, N, 1, 0, 0, &IPIV);

            FLA_Obj A, A_FLASH;
            FLA_Obj_create( FLA_DOUBLE, N, N, 0, 0, &A );
            FLA_Random_matrix( A );

            int info;
            FLASH_Obj_create_hier_copy_of_flat(A, depth, &blocksize, &A_FLASH);
            info = FLASH_LU_piv(A_FLASH, IPIV);

            FLASH_Obj_free( &A_FLASH ); FLA_Obj_free( &IPIV );
        }
    N += INC;
}

FLA_Finalize();

return 0;

}

* build

gcc -o flame.x flame.c -I /home/xx/lib/libflame/include/ /home/xx/project/libflame/lib/x86_64-unknown-linux-gnu/libflame.a /home/xx/lib/openblas/lib/libopenblas.a -fopenmp -lpthread -lm


* Error Information
![image](https://user-images.githubusercontent.com/51168944/220656242-40f1725e-9610-4548-8e5c-163ca388d49b.png)
iotamudelta commented 1 year ago

If you are using the FLASH interface to libflame, you're probably better off using FLASH_LU_incpiv(). It provides a pivoted LU decomposition more suitable to an algorithms-by-blocks approach like SuperMatrix/FLASH.

There's an example for its use to be found here: src/lapack/dec/lu/incpiv/front/flamec/test/flash_sm

FuncJ commented 1 year ago

Thanks, I'll try it. What can I do to utilize the function 'FLASH_LU_piv' correctly?

iotamudelta commented 1 year ago

See starting here: https://github.com/flame/libflame/blob/d48aa5d42525b0b8d077336763e70e669365b727/src/lapack/dec/lu/incpiv/front/flamec/test/flash_sm/time_LU_incpiv.c#L37 in the test case quoted above. AFAIK the use of the helper functions for creation of hierarchical matrices is strongly advised.

FuncJ commented 1 year ago

Thanks, It is my fault for misunderstanding the function 'FLASH_LU_piv' usage. Not only the matrix 'A_FLASH' should be a hierarchical object, but also the matrix 'IPIV'.