es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es posible permitir que el código fuente de Fortran detecte las banderas del compilador?

La motivación es que quiero que el código fuente en Fortran sea flexible con las opciones del compilador relacionadas con BLAS serial/paralelo. Puedo especificar -mkl=parallel para mkl o USE_OPENMP=1 para lopenblas en el Makefile. Puedo usar make ifort o make gfortran o make blah blah para cambiar las librerías en el Makefile. Pero,

a) Si uso -mkl=parallel en el Makefile, necesito establecer call mkl_set_num_threads(numthreads) en el código fuente.

b) Si uso OpenBLAS con USE_OPENMP=1, tal vez necesite openblas_set_num_threads(num_threads) en el código fuente.

c) Por el momento, si solo hay lblas y/o -mkl=sequential, tengo que configurar manualmente los hilos de dgemm (como una especie de descomposición por bloques), sin importar OMP_NUM_THREADS. Eso está bien, pero necesito usar if para controlar que el código fuente siga ese camino, si el código fuente tiene líneas para a) y b)

La programación manual de hilos de dgemm en c) es de alguna manera universal. Cuando quiero aprovechar BLAS paralelo de las librerías, las cosas pueden complicarse tanto que no sé cómo cambiar el código fuente con respecto a las opciones del compilador.

Además, OMP_NUM_THREADS desde el archivo de entorno .bashrc no es preferible. (Lo siento, debería haber mencionado este punto antes). El código fuente lee un archivo de entrada que especifica el número de núcleos que se utilizan y utiliza omp_set_num_thread para establecer el número de núcleos objetivo, en lugar del archivo de entorno.

Además, según mi prueba con MKL, OMP_NUM_THREADS no puede suprimir call mkl_set_num_threads. Es decir, tengo que especificar call mkl_set_num_threads para que funcione con la opción -mkl=parallel.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en Fortran, OpenMP, BLAS, Intel-MKL y OpenBLAS, puedo recomendar los siguientes pasos para hacer que el código Fortran sea flexible en cuanto a las opciones del compilador relacionadas con BLAS serial/paralelo:

    1. Utilizar declaraciones condicionales para verificar las opciones de biblioteca elegidas en el Makefile y llamar a las funciones de subprocesamiento correspondientes en el código fuente. Por ejemplo:
    if (mkl_library_used) then
        call mkl_set_num_threads(numthreads)
    else if (openblas_library_used) then
        call openblas_set_num_threads(num_threads)
    else
        ! Utilizar subprocesos predeterminados para dgemm
        if (sequential_blas_or_lblas) then
            ! Configurar manualmente los subprocesos de dgemm
        end if
    end if
    
    1. En el caso de utilizar MKL con -mkl=parallel, es necesario llamar a call mkl_set_num_threads independientemente de la variable de entorno OMP_NUM_THREADS. Por lo tanto, el código debe leer el número de subprocesos desde el archivo de entrada y configurarlo mediante omp_set_num_threads.
    2. Evitar depender de la variable de entorno OMP_NUM_THREADS para configurar el número de subprocesos. En su lugar, leer el número de subprocesos desde un archivo de entrada.

    Al seguir estos pasos, el código fuente de Fortran puede hacerse flexible para varias opciones de compilador relacionadas con BLAS serial/paralelo y utilizar las funciones de subprocesamiento adecuadas según las opciones de biblioteca.

Comments are closed.