fix OMP in BSIM3/simd, simdified BSIM3trunc

This commit is contained in:
Florian Ballenegger 2020-08-06 23:57:25 +02:00
parent a15f9a1eba
commit 6ec7b3b9e5
4 changed files with 5233 additions and 14 deletions

View File

@ -2996,8 +2996,12 @@ line900:
here->BSIM3rhsD = m * (ceqbd - cdreq - ceqqd);
here->BSIM3rhsS = m * (cdreq + ceqbs + ceqqg
+ ceqqb + ceqqd);
if (here->BSIM3nqsMod)
#ifndef OMP_EFFMEM
if (here->BSIM3nqsMod)
here->BSIM3rhsQ = m * (cqcheq - cqdef);
#else
*(ckt->CKTrhs + here->BSIM3qNode) += m * (cqcheq - cqdef);
#endif
#else
(*(ckt->CKTrhs + here->BSIM3gNode) -= m * ceqqg);
(*(ckt->CKTrhs + here->BSIM3bNode) -= m * (ceqbs + ceqbd + ceqqb));
@ -3051,7 +3055,8 @@ line900:
here->BSIM3SPdpPt = m * (here->BSIM3gds + RevSum - gcsdb
- sxpart * ggtd - T1 * dsxpart_dVd - gbspdp);
if (here->BSIM3nqsMod)
#ifndef OMP_EFFMEM
if (here->BSIM3nqsMod)
{ here->BSIM3QqPt = m * (gqdef + here->BSIM3gtau);
here->BSIM3DPqPt = m * (dxpart * here->BSIM3gtau);
@ -3063,6 +3068,20 @@ line900:
here->BSIM3QspPt = m * (ggts - gcqsb);
here->BSIM3QbPt = m * (ggtb - gcqbb);
}
#else
if (here->BSIM3nqsMod)
{ *(here->BSIM3QqPtr) += m * (gqdef + here->BSIM3gtau);
*(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau);
*(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau);
*(here->BSIM3GqPtr) -= m * here->BSIM3gtau;
*(here->BSIM3QgPtr) += m * (ggtg - gcqgb);
*(here->BSIM3QdpPtr) += m * (ggtd - gcqdb);
*(here->BSIM3QspPtr) += m * (ggts - gcqsb);
*(here->BSIM3QbPtr) += m * (ggtb - gcqbb);
}
#endif
#else
(*(here->BSIM3DdPtr) += m * here->BSIM3drainConductance);
(*(here->BSIM3GgPtr) += m * (gcggb - ggtg));
@ -3137,14 +3156,17 @@ void BSIM3SIMDLoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
for(idx = 0; idx < InstCount; idx++) {
here = InstArray[idx];
model = BSIM3SIMDmodPtr(here);
ckt->CKTnoncon += here->BSIM3noncon;
/* Update b for Ax = b */
(*(ckt->CKTrhs + here->BSIM3gNode) -= here->BSIM3rhsG);
(*(ckt->CKTrhs + here->BSIM3bNode) -= here->BSIM3rhsB);
(*(ckt->CKTrhs + here->BSIM3dNodePrime) += here->BSIM3rhsD);
(*(ckt->CKTrhs + here->BSIM3sNodePrime) += here->BSIM3rhsS);
#ifndef OMP_EFFMEM
if (here->BSIM3nqsMod)
(*(ckt->CKTrhs + here->BSIM3qNode) += here->BSIM3rhsQ);
#endif
/* Update A for Ax = b */
(*(here->BSIM3DdPtr) += here->BSIM3DdPt);
(*(here->BSIM3GgPtr) += here->BSIM3GgPt);
@ -3169,7 +3191,8 @@ void BSIM3SIMDLoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
(*(here->BSIM3SPbPtr) -= here->BSIM3SPbPt);
(*(here->BSIM3SPdpPtr) -= here->BSIM3SPdpPt);
if (here->BSIM3nqsMod)
#ifndef OMP_EFFMEM
if (here->BSIM3nqsMod)
{ *(here->BSIM3QqPtr) += here->BSIM3QqPt;
*(here->BSIM3DPqPtr) += here->BSIM3DPqPt;
@ -3181,6 +3204,7 @@ void BSIM3SIMDLoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
*(here->BSIM3QspPtr) += here->BSIM3QspPt;
*(here->BSIM3QbPtr) += here->BSIM3QbPt;
}
#endif
}
}

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,10 @@
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
#include "ngspice/SIMD/simdvector.h"
#include "ngspice/SIMD/simdckt.h"
#include <float.h>
int
BSIM3SIMDtrunc(
@ -23,28 +27,39 @@ double *timeStep)
{
BSIM3model *model = (BSIM3model*)inModel;
BSIM3instance *here;
int i;
#ifdef STEPDEBUG
double debugtemp;
#endif /* STEPDEBUG */
for (; model != NULL; model = BSIM3SIMDnextModel(model))
{ for (here = BSIM3SIMDinstances(model); here != NULL;
here = BSIM3SIMDnextInstance(here))
for(i=0;i<model->BSIM3InstCount;i+=NSIMD)
{
VecNi indexes;
#ifdef STEPDEBUG
debugtemp = *timeStep;
#endif /* STEPDEBUG */
CKTterr(here->BSIM3qb,ckt,timeStep);
CKTterr(here->BSIM3qg,ckt,timeStep);
CKTterr(here->BSIM3qd,ckt,timeStep);
for(int k=0;k<NSIMD;k++)
indexes[k] = model->BSIM3InstanceArray[i+k]->BSIM3qb;
vecN_CKTterr(indexes,ckt,timeStep);
for(int k=0;k<NSIMD;k++)
indexes[k] = model->BSIM3InstanceArray[i+k]->BSIM3qg;
vecN_CKTterr(indexes,ckt,timeStep);
for(int k=0;k<NSIMD;k++)
indexes[k] = model->BSIM3InstanceArray[i+k]->BSIM3qd;
vecN_CKTterr(indexes,ckt,timeStep);
#ifdef STEPDEBUG
if(debugtemp != *timeStep)
{ printf("device %s reduces step from %g to %g\n",
here->BSIM3name,debugtemp,*timeStep);
model->BSIM3v32InstanceArray[i]->BSIM3name,debugtemp,*timeStep);
}
#endif /* STEPDEBUG */
}
for(;i<model->BSIM3InstCount;i++)
{
CKTterr(model->BSIM3InstanceArray[i]->BSIM3qb,ckt,timeStep);
CKTterr(model->BSIM3InstanceArray[i]->BSIM3qg,ckt,timeStep);
CKTterr(model->BSIM3InstanceArray[i]->BSIM3qd,ckt,timeStep);
}
return(OK);
}

View File

@ -192,8 +192,9 @@ typedef struct sBSIM3instance
double BSIM3SIMDcdhat;
double BSIM3SIMDcbhat;
int BSIM3SIMDCheck;
/* per instance storage of results, to update matrix at a later stge */
int BSIM3noncon;
double BSIM3rhsG;
double BSIM3rhsB;
double BSIM3rhsD;