¿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
.
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:
Makefile
y llamar a las funciones de subprocesamiento correspondientes en el código fuente. Por ejemplo:MKL
con-mkl=parallel
, es necesario llamar acall mkl_set_num_threads
independientemente de la variable de entornoOMP_NUM_THREADS
. Por lo tanto, el código debe leer el número de subprocesos desde el archivo de entrada y configurarlo medianteomp_set_num_threads
.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.