From c093f985e170e53b64a6239f459e4fd56a514da8 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Wed, 11 Feb 2026 20:15:57 +0100 Subject: [PATCH] Move setting up OMP from CKTsetup() to inp_readall(). Add a check for abvailable logical CPU cores, and use half of them as default. --- src/frontend/inpcom.c | 24 ++++++++++++++++++++++++ src/spicelib/analysis/cktsetup.c | 19 +------------------ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index a0d30f249..75a3f3b07 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -58,6 +58,11 @@ Author: 1985 Wayne A. Christopher /* gtri - end - 12/12/90 */ #endif +#ifdef USE_OMP +#include +#include "ngspice/cpextern.h" +#endif + /* SJB - Uncomment this line for debug tracing */ /*#define TRACE*/ @@ -73,6 +78,10 @@ Author: 1985 Wayne A. Christopher #define VALIDCHARS "!$%_#?@.[]&" +#ifdef USE_OMP +int nthreads = 4; +#endif + static struct library { char *realpath; char *habitat; @@ -1088,6 +1097,21 @@ struct card *inp_readall(FILE *fp, const char *dir_name, const char* file_name, struct card *tmp_ptr1; struct names *subckt_w_params = new_names(); + /* set the number of threads used by ngspice via OpenMP */ +#ifdef USE_OMP + if (!cp_getvar("num_threads", CP_NUM, &nthreads, 0)) { + nthreads = omp_get_num_procs(); + fprintf(stdout, "\nNote: %d logical cores detected, ", nthreads); + nthreads = (int)(nthreads / 2); + fprintf(stdout, "max %d threads are used by ngspice.\n", nthreads); + // fprintf(stdout, " (May be overriden by 'set num_threads = xx in .spiceinit.)\n\n", nthreads); + } + else + fprintf(stdout, "\nNote: Number of threads used by ngspice set to %d.\n\n", nthreads); + + omp_set_num_threads(nthreads); +#endif + /* skip title line */ struct card *working = cc->nextcard; diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 985739c64..b0fd47957 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -20,11 +20,6 @@ Author: 1985 Thomas L. Quarles #include "ngspice/enh.h" #endif -#ifdef USE_OMP -#include -#include "ngspice/cpextern.h" -#endif - #define CKALLOC(var,size,type) \ if(size && ((var = TMALLOC(type, size)) == NULL)){\ return(E_NOMEM);\ @@ -35,9 +30,7 @@ CKTsetup(CKTcircuit *ckt) { int i; int error; -#ifdef USE_OMP - int nthreads = 2; -#endif + #ifdef XSPICE /* gtri - begin - Setup for adding rshunt option resistors */ CKTnode *node; @@ -86,16 +79,6 @@ CKTsetup(CKTcircuit *ckt) matrix = ckt->CKTmatrix; -#ifdef USE_OMP - if (!cp_getvar("num_threads", CP_NUM, &nthreads, 0)) - nthreads = 2; - - omp_set_num_threads(nthreads); -/* if (nthreads == 1) - printf("OpenMP: %d thread is requested in ngspice\n", nthreads); - else - printf("OpenMP: %d threads are requested in ngspice\n", nthreads);*/ -#endif #ifdef HAS_PROGREP SetAnalyse("Device Setup", 0);