Fix the case when CUSPICE has only one model for the Matrix or one model for the RHS

This commit is contained in:
Francesco Lannutti 2018-04-23 23:34:13 +02:00 committed by rlar
parent bd4cc15b61
commit d14f091a2f
9 changed files with 188 additions and 177 deletions

View File

@ -35,7 +35,7 @@ cuCKTflush
CKTcircuit *ckt CKTcircuit *ckt
) )
{ {
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
long unsigned int m, mRHS ; long unsigned int m, mRHS ;
m = (long unsigned int)(ckt->total_n_values + 1) ; // + 1 because of CKTdiagGmin m = (long unsigned int)(ckt->total_n_values + 1) ; // + 1 because of CKTdiagGmin
@ -46,14 +46,6 @@ CKTcircuit *ckt
/* Clean-up the CKTloadOutputRHS */ /* Clean-up the CKTloadOutputRHS */
cudaMemset (ckt->d_CKTloadOutputRHS, 0, mRHS * sizeof(double)) ; cudaMemset (ckt->d_CKTloadOutputRHS, 0, mRHS * sizeof(double)) ;
} else {
int i, size ;
size = SMPmatSize (ckt->CKTmatrix) ;
for (i = 0 ; i <= size ; i++)
*(ckt->CKTrhs + i) = 0 ;
SMPclear (ckt->CKTmatrix) ;
} }
return (OK) ; return (OK) ;

View File

@ -47,7 +47,7 @@ CKTcircuit *ckt
{ {
cudaError_t status ; cudaError_t status ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
status = cudaMemcpy (ckt->d_CKTnoncon, &(ckt->CKTnoncon), sizeof(int), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTnoncon, &(ckt->CKTnoncon), sizeof(int), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTnoncon, 1, int, status) CUDAMEMCPYCHECK (ckt->d_CKTnoncon, 1, int, status)
} }
@ -63,7 +63,7 @@ CKTcircuit *ckt
{ {
cudaError_t status ; cudaError_t status ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
status = cudaMemcpy (&(ckt->CKTnoncon), ckt->d_CKTnoncon, sizeof(int), cudaMemcpyDeviceToHost) ; status = cudaMemcpy (&(ckt->CKTnoncon), ckt->d_CKTnoncon, sizeof(int), cudaMemcpyDeviceToHost) ;
CUDAMEMCPYCHECK (&(ckt->CKTnoncon), 1, int, status) CUDAMEMCPYCHECK (&(ckt->CKTnoncon), 1, int, status)
} }

View File

@ -47,7 +47,7 @@ CKTcircuit *ckt
{ {
long unsigned int size ; long unsigned int size ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
size = (long unsigned int)(ckt->d_MatrixSize + 1) ; size = (long unsigned int)(ckt->d_MatrixSize + 1) ;
cudaMemset (ckt->d_CKTrhsOld, 0, size * sizeof(double)) ; cudaMemset (ckt->d_CKTrhsOld, 0, size * sizeof(double)) ;
} }
@ -64,7 +64,7 @@ CKTcircuit *ckt
long unsigned int size ; long unsigned int size ;
cudaError_t status ; cudaError_t status ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
size = (long unsigned int)(ckt->d_MatrixSize + 1) ; size = (long unsigned int)(ckt->d_MatrixSize + 1) ;
status = cudaMemcpy (ckt->d_CKTrhsOld, ckt->CKTrhsOld, size * sizeof(double), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTrhsOld, ckt->CKTrhsOld, size * sizeof(double), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTrhsOld, size, double, status) CUDAMEMCPYCHECK (ckt->d_CKTrhsOld, size, double, status)
@ -82,7 +82,7 @@ CKTcircuit *ckt
long unsigned int size ; long unsigned int size ;
cudaError_t status ; cudaError_t status ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
size = (long unsigned int)(ckt->d_MatrixSize + 1) ; size = (long unsigned int)(ckt->d_MatrixSize + 1) ;
status = cudaMemcpy (ckt->CKTrhsOld, ckt->d_CKTrhsOld, size * sizeof(double), cudaMemcpyDeviceToHost) ; status = cudaMemcpy (ckt->CKTrhsOld, ckt->d_CKTrhsOld, size * sizeof(double), cudaMemcpyDeviceToHost) ;
CUDAMEMCPYCHECK (ckt->CKTrhsOld, size, double, status) CUDAMEMCPYCHECK (ckt->CKTrhsOld, size, double, status)

View File

@ -76,59 +76,67 @@ CKTcircuit *ckt
size2 = (long unsigned int)ckt->CKTnumStates ; size2 = (long unsigned int)ckt->CKTnumStates ;
size3 = (long unsigned int)ckt->total_n_timeSteps ; size3 = (long unsigned int)ckt->total_n_timeSteps ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
/* Topology Matrix Handling */ /* Topology Matrix Handling */
status = cudaMalloc ((void **)&(ckt->CKTmatrix->d_CKTrhs), (n + 1) * sizeof(double)) ; if (ckt->total_n_Ptr > 0) {
CUDAMALLOCCHECK (ckt->CKTmatrix->d_CKTrhs, (n + 1), double, status) status = cudaMalloc ((void **)&(ckt->CKTmatrix->d_CKTkluAx), nz * sizeof(double)) ;
CUDAMALLOCCHECK (ckt->CKTmatrix->d_CKTkluAx, nz, double, status)
status = cudaMalloc ((void **)&(ckt->CKTmatrix->d_CKTkluAx), nz * sizeof(double)) ; status = cudaMalloc ((void **)&(ckt->d_CKTloadOutput), m * sizeof(double)) ;
CUDAMALLOCCHECK (ckt->CKTmatrix->d_CKTkluAx, nz, double, status) CUDAMALLOCCHECK (ckt->d_CKTloadOutput, m, double, status)
status = cudaMalloc ((void **)&(ckt->d_CKTloadOutput), m * sizeof(double)) ; status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRp), (nz + 1) * sizeof(int)) ;
CUDAMALLOCCHECK (ckt->d_CKTloadOutput, m, double, status) CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRp, (nz + 1), int, status)
status = cudaMalloc ((void **)&(ckt->d_CKTloadOutputRHS), mRHS * sizeof(double)) ; status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRj), TopologyNNZ * sizeof(int)) ;
CUDAMALLOCCHECK (ckt->d_CKTloadOutputRHS, mRHS, double, status) CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRj, TopologyNNZ, int, status)
status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRp), (nz + 1) * sizeof(int)) ; status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRx), TopologyNNZ * sizeof(double)) ;
CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRp, (nz + 1), int, status) CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRx, TopologyNNZ, double, status)
}
status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRj), TopologyNNZ * sizeof(int)) ; if (ckt->total_n_PtrRHS > 0) {
CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRj, TopologyNNZ, int, status) status = cudaMalloc ((void **)&(ckt->CKTmatrix->d_CKTrhs), (n + 1) * sizeof(double)) ;
CUDAMALLOCCHECK (ckt->CKTmatrix->d_CKTrhs, (n + 1), double, status)
status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRx), TopologyNNZ * sizeof(double)) ; status = cudaMalloc ((void **)&(ckt->d_CKTloadOutputRHS), mRHS * sizeof(double)) ;
CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRx, TopologyNNZ, double, status) CUDAMALLOCCHECK (ckt->d_CKTloadOutputRHS, mRHS, double, status)
status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRpRHS), ((n + 1) + 1) * sizeof(int)) ; status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRpRHS), ((n + 1) + 1) * sizeof(int)) ;
CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRpRHS, ((n + 1) + 1), int, status) CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRpRHS, ((n + 1) + 1), int, status)
status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRjRHS), TopologyNNZRHS * sizeof(int)) ; status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRjRHS), TopologyNNZRHS * sizeof(int)) ;
CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRjRHS, TopologyNNZRHS, int, status) CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRjRHS, TopologyNNZRHS, int, status)
status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRxRHS), TopologyNNZRHS * sizeof(double)) ; status = cudaMalloc ((void **)&(ckt->d_CKTtopologyMatrixCSRxRHS), TopologyNNZRHS * sizeof(double)) ;
CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRxRHS, TopologyNNZRHS, double, status) CUDAMALLOCCHECK (ckt->d_CKTtopologyMatrixCSRxRHS, TopologyNNZRHS, double, status)
}
cudaMemset (ckt->d_CKTloadOutput + ckt->total_n_values, 0, sizeof(double)) ; //DiagGmin is 0 at the beginning if (ckt->total_n_Ptr > 0) {
cudaMemset (ckt->d_CKTloadOutput + ckt->total_n_values, 0, sizeof(double)) ; //DiagGmin is 0 at the beginning
status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRp, ckt->CKTtopologyMatrixCSRp, (nz + 1) * sizeof(int), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRp, ckt->CKTtopologyMatrixCSRp, (nz + 1) * sizeof(int), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRp, (nz + 1), int, status) CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRp, (nz + 1), int, status)
status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRj, ckt->CKTtopologyMatrixCOOj, TopologyNNZ * sizeof(int), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRj, ckt->CKTtopologyMatrixCOOj, TopologyNNZ * sizeof(int), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRj, TopologyNNZ, int, status) CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRj, TopologyNNZ, int, status)
status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRx, ckt->CKTtopologyMatrixCOOx, TopologyNNZ * sizeof(double), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRx, ckt->CKTtopologyMatrixCOOx, TopologyNNZ * sizeof(double), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRx, TopologyNNZ, double, status) CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRx, TopologyNNZ, double, status)
}
status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRpRHS, ckt->CKTtopologyMatrixCSRpRHS, ((n + 1) + 1) * sizeof(int), cudaMemcpyHostToDevice) ; if (ckt->total_n_PtrRHS > 0) {
CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRpRHS, ((n + 1) + 1), int, status) status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRpRHS, ckt->CKTtopologyMatrixCSRpRHS, ((n + 1) + 1) * sizeof(int), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRpRHS, ((n + 1) + 1), int, status)
status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRjRHS, ckt->CKTtopologyMatrixCOOjRHS, TopologyNNZRHS * sizeof(int), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRjRHS, ckt->CKTtopologyMatrixCOOjRHS, TopologyNNZRHS * sizeof(int), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRjRHS, TopologyNNZRHS, int, status) CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRjRHS, TopologyNNZRHS, int, status)
status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRxRHS, ckt->CKTtopologyMatrixCOOxRHS, TopologyNNZRHS * sizeof(double), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTtopologyMatrixCSRxRHS, ckt->CKTtopologyMatrixCOOxRHS, TopologyNNZRHS * sizeof(double), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRxRHS, TopologyNNZRHS, double, status) CUDAMEMCPYCHECK (ckt->d_CKTtopologyMatrixCSRxRHS, TopologyNNZRHS, double, status)
}
/* ------------------------ */ /* ------------------------ */
status = cudaMalloc ((void **)&(ckt->d_CKTnoncon), sizeof(int)) ; status = cudaMalloc ((void **)&(ckt->d_CKTnoncon), sizeof(int)) ;

View File

@ -48,7 +48,7 @@ CKTcircuit *ckt
{ {
long unsigned int size ; long unsigned int size ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
size = (long unsigned int)ckt->CKTnumStates ; size = (long unsigned int)ckt->CKTnumStates ;
cudaMemset (ckt->d_CKTstate0, 0, size * sizeof(double)) ; cudaMemset (ckt->d_CKTstate0, 0, size * sizeof(double)) ;
} }
@ -65,7 +65,7 @@ CKTcircuit *ckt
long unsigned int size ; long unsigned int size ;
cudaError_t status ; cudaError_t status ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
size = (long unsigned int)ckt->CKTnumStates ; size = (long unsigned int)ckt->CKTnumStates ;
status = cudaMemcpy (ckt->d_CKTstate0, ckt->CKTstate0, size * sizeof(double), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTstate0, ckt->CKTstate0, size * sizeof(double), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTstate0, size, double, status) CUDAMEMCPYCHECK (ckt->d_CKTstate0, size, double, status)
@ -83,7 +83,7 @@ CKTcircuit *ckt
long unsigned int size ; long unsigned int size ;
cudaError_t status ; cudaError_t status ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
size = (long unsigned int)ckt->CKTnumStates ; size = (long unsigned int)ckt->CKTnumStates ;
status = cudaMemcpy (ckt->CKTstate0, ckt->d_CKTstate0, size * sizeof(double), cudaMemcpyDeviceToHost) ; status = cudaMemcpy (ckt->CKTstate0, ckt->d_CKTstate0, size * sizeof(double), cudaMemcpyDeviceToHost) ;
CUDAMEMCPYCHECK (ckt->CKTstate0, size, double, status) CUDAMEMCPYCHECK (ckt->CKTstate0, size, double, status)
@ -98,7 +98,7 @@ cuCKTstate01copy
CKTcircuit *ckt CKTcircuit *ckt
) )
{ {
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
long unsigned int size ; long unsigned int size ;
cudaError_t status ; cudaError_t status ;
@ -121,7 +121,7 @@ CKTcircuit *ckt
int i ; int i ;
double *temp ; double *temp ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
temp = ckt->d_CKTstates [ckt->CKTmaxOrder + 1] ; temp = ckt->d_CKTstates [ckt->CKTmaxOrder + 1] ;
for (i = ckt->CKTmaxOrder ; i >= 0 ; i--) for (i = ckt->CKTmaxOrder ; i >= 0 ; i--)
ckt->d_CKTstates [i + 1] = ckt->d_CKTstates [i] ; ckt->d_CKTstates [i + 1] = ckt->d_CKTstates [i] ;
@ -144,7 +144,7 @@ cuCKTstate123copy
CKTcircuit *ckt CKTcircuit *ckt
) )
{ {
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
long unsigned int size ; long unsigned int size ;
cudaError_t status ; cudaError_t status ;
@ -171,7 +171,7 @@ CKTcircuit *ckt
{ {
cudaError_t status ; cudaError_t status ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
status = cudaMemcpy (ckt->d_CKTdeltaOld, ckt->CKTdeltaOld, 7 * sizeof(double), cudaMemcpyHostToDevice) ; status = cudaMemcpy (ckt->d_CKTdeltaOld, ckt->CKTdeltaOld, 7 * sizeof(double), cudaMemcpyHostToDevice) ;
CUDAMEMCPYCHECK (ckt->d_CKTdeltaOld, 7, double, status) CUDAMEMCPYCHECK (ckt->d_CKTdeltaOld, 7, double, status)
} }

View File

@ -48,13 +48,16 @@ CKTcircuit *ckt
long unsigned int nz, n ; long unsigned int nz, n ;
cudaError_t status ; cudaError_t status ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0) {
nz = (long unsigned int)ckt->CKTmatrix->CKTklunz ; nz = (long unsigned int)ckt->CKTmatrix->CKTklunz ;
n = (long unsigned int)ckt->CKTmatrix->CKTkluN ;
/* Copy back the Matrix */ /* Copy back the Matrix */
status = cudaMemcpy (ckt->CKTmatrix->CKTkluAx, ckt->CKTmatrix->d_CKTkluAx, nz * sizeof(double), cudaMemcpyDeviceToHost) ; status = cudaMemcpy (ckt->CKTmatrix->CKTkluAx, ckt->CKTmatrix->d_CKTkluAx, nz * sizeof(double), cudaMemcpyDeviceToHost) ;
CUDAMEMCPYCHECK (ckt->CKTmatrix->CKTkluAx, nz, double, status) CUDAMEMCPYCHECK (ckt->CKTmatrix->CKTkluAx, nz, double, status)
}
if (ckt->total_n_PtrRHS > 0) {
n = (long unsigned int)ckt->CKTmatrix->CKTkluN ;
/* Copy back the RHS */ /* Copy back the RHS */
status = cudaMemcpy (ckt->CKTrhs, ckt->CKTmatrix->d_CKTrhs, (n + 1) * sizeof(double), cudaMemcpyDeviceToHost) ; status = cudaMemcpy (ckt->CKTrhs, ckt->CKTmatrix->d_CKTrhs, (n + 1) * sizeof(double), cudaMemcpyDeviceToHost) ;

View File

@ -31,7 +31,7 @@ cuCKTtrunc
CKTcircuit *ckt, double timetemp, double *timeStep CKTcircuit *ckt, double timetemp, double *timeStep
) )
{ {
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
long unsigned int size ; long unsigned int size ;
double timetempGPU ; double timetempGPU ;
int thread_x, thread_y, block_x ; int thread_x, thread_y, block_x ;

View File

@ -138,44 +138,48 @@ CKTload(CKTcircuit *ckt)
// without the zeroes along the diagonal // without the zeroes along the diagonal
TopologyNNZRHS = ckt->total_n_PtrRHS ; TopologyNNZRHS = ckt->total_n_PtrRHS ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
/* Copy the CKTdiagGmin value to the GPU */ if (ckt->total_n_Ptr > 0) {
// The real Gmin is needed only when the matrix will reside entirely on the GPU /* Copy the CKTdiagGmin value to the GPU */
// Right now, only some models support CUDA, so the matrix is only partially created on the GPU // The real Gmin is needed only when the matrix will reside entirely on the GPU
cudaMemset (ckt->d_CKTloadOutput + ckt->total_n_values, 0, sizeof(double)) ; // Right now, only some models support CUDA, so the matrix is only partially created on the GPU
//cudaError_t statusMemcpy ; cudaMemset (ckt->d_CKTloadOutput + ckt->total_n_values, 0, sizeof(double)) ;
//statusMemcpy = cudaMemcpy (ckt->d_CKTloadOutput + ckt->total_n_values, &(ckt->CKTdiagGmin), sizeof(double), cudaMemcpyHostToDevice) ; //cudaError_t statusMemcpy ;
//CUDAMEMCPYCHECK (ckt->d_CKTloadOutput + ckt->total_n_values, 1, double, statusMemcpy) //statusMemcpy = cudaMemcpy (ckt->d_CKTloadOutput + ckt->total_n_values, &(ckt->CKTdiagGmin), sizeof(double), cudaMemcpyHostToDevice) ;
//CUDAMEMCPYCHECK (ckt->d_CKTloadOutput + ckt->total_n_values, 1, double, statusMemcpy)
/* Performing CSRMV for the Sparse Matrix using CUSPARSE */ /* Performing CSRMV for the Sparse Matrix using CUSPARSE */
cusparseStatus = cusparseDcsrmv ((cusparseHandle_t)(ckt->CKTmatrix->CKTcsrmvHandle), cusparseStatus = cusparseDcsrmv ((cusparseHandle_t)(ckt->CKTmatrix->CKTcsrmvHandle),
CUSPARSE_OPERATION_NON_TRANSPOSE, CUSPARSE_OPERATION_NON_TRANSPOSE,
ckt->CKTmatrix->CKTklunz, ckt->total_n_values + 1, ckt->CKTmatrix->CKTklunz, ckt->total_n_values + 1,
ckt->total_n_Ptr + ckt->CKTdiagElements, ckt->total_n_Ptr + ckt->CKTdiagElements,
&alpha, (cusparseMatDescr_t)(ckt->CKTmatrix->CKTcsrmvDescr), &alpha, (cusparseMatDescr_t)(ckt->CKTmatrix->CKTcsrmvDescr),
ckt->d_CKTtopologyMatrixCSRx, ckt->d_CKTtopologyMatrixCSRp, ckt->d_CKTtopologyMatrixCSRx, ckt->d_CKTtopologyMatrixCSRp,
ckt->d_CKTtopologyMatrixCSRj, ckt->d_CKTloadOutput, &beta, ckt->d_CKTtopologyMatrixCSRj, ckt->d_CKTloadOutput, &beta,
ckt->CKTmatrix->d_CKTkluAx) ; ckt->CKTmatrix->d_CKTkluAx) ;
if (cusparseStatus != CUSPARSE_STATUS_SUCCESS) if (cusparseStatus != CUSPARSE_STATUS_SUCCESS)
{ {
fprintf (stderr, "CUSPARSE MATRIX Call Error\n") ; fprintf (stderr, "CUSPARSE MATRIX Call Error\n") ;
return (E_NOMEM) ; return (E_NOMEM) ;
}
} }
/* Performing CSRMV for the RHS using CUSPARSE */ if (ckt->total_n_PtrRHS > 0) {
cusparseStatus = cusparseDcsrmv ((cusparseHandle_t)(ckt->CKTmatrix->CKTcsrmvHandle), /* Performing CSRMV for the RHS using CUSPARSE */
CUSPARSE_OPERATION_NON_TRANSPOSE, cusparseStatus = cusparseDcsrmv ((cusparseHandle_t)(ckt->CKTmatrix->CKTcsrmvHandle),
ckt->CKTmatrix->CKTkluN + 1, ckt->total_n_valuesRHS, ckt->total_n_PtrRHS, CUSPARSE_OPERATION_NON_TRANSPOSE,
&alpha, (cusparseMatDescr_t)(ckt->CKTmatrix->CKTcsrmvDescr), ckt->CKTmatrix->CKTkluN + 1, ckt->total_n_valuesRHS, ckt->total_n_PtrRHS,
ckt->d_CKTtopologyMatrixCSRxRHS, ckt->d_CKTtopologyMatrixCSRpRHS, &alpha, (cusparseMatDescr_t)(ckt->CKTmatrix->CKTcsrmvDescr),
ckt->d_CKTtopologyMatrixCSRjRHS, ckt->d_CKTloadOutputRHS, &beta, ckt->d_CKTtopologyMatrixCSRxRHS, ckt->d_CKTtopologyMatrixCSRpRHS,
ckt->CKTmatrix->d_CKTrhs) ; ckt->d_CKTtopologyMatrixCSRjRHS, ckt->d_CKTloadOutputRHS, &beta,
ckt->CKTmatrix->d_CKTrhs) ;
if (cusparseStatus != CUSPARSE_STATUS_SUCCESS) if (cusparseStatus != CUSPARSE_STATUS_SUCCESS)
{ {
fprintf (stderr, "CUSPARSE RHS Call Error\n") ; fprintf (stderr, "CUSPARSE RHS Call Error\n") ;
return (E_NOMEM) ; return (E_NOMEM) ;
}
} }
cudaDeviceSynchronize () ; cudaDeviceSynchronize () ;

View File

@ -223,110 +223,114 @@ CKTsetup(CKTcircuit *ckt)
/* CKTloadOutput for the RHS Vector allocation - DIRECTLY in the GPU memory */ /* CKTloadOutput for the RHS Vector allocation - DIRECTLY in the GPU memory */
if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
/* Diagonal Elements Counting */
j = 0 ;
for (i = 0 ; i < n ; i++)
if (ckt->CKTmatrix->CKTdiag_CSC [i] != NULL)
j++ ;
/* Diagonal Elements Counting */ ckt->CKTdiagElements = j ;
j = 0 ; TopologyNNZ = ckt->total_n_Ptr + ckt->CKTdiagElements ; // + ckt->CKTdiagElements because of CKTdiagGmin
for (i = 0 ; i < n ; i++) // without the zeroes along the diagonal
if (ckt->CKTmatrix->CKTdiag_CSC [i] != NULL) TopologyNNZRHS = ckt->total_n_PtrRHS ;
j++ ;
ckt->CKTdiagElements = j ; if (ckt->total_n_Ptr > 0) {
/* Topology Matrix Pre-Allocation in COO format */
ckt->CKTtopologyMatrixCOOi = TMALLOC (int, TopologyNNZ) ;
ckt->CKTtopologyMatrixCOOj = TMALLOC (int, TopologyNNZ) ;
ckt->CKTtopologyMatrixCOOx = TMALLOC (double, TopologyNNZ) ;
/* Topology Matrix Pre-Allocation in COO format */ /* Topology Matrix Pre-Allocation in CSR format */
TopologyNNZ = ckt->total_n_Ptr + ckt->CKTdiagElements ; // + ckt->CKTdiagElements because of CKTdiagGmin ckt->CKTtopologyMatrixCSRp = TMALLOC (int, nz + 1) ;
// without the zeroes along the diagonal
ckt->CKTtopologyMatrixCOOi = TMALLOC (int, TopologyNNZ) ;
ckt->CKTtopologyMatrixCOOj = TMALLOC (int, TopologyNNZ) ;
ckt->CKTtopologyMatrixCOOx = TMALLOC (double, TopologyNNZ) ;
/* Topology Matrix for the RHS Pre-Allocation in COO format */
TopologyNNZRHS = ckt->total_n_PtrRHS ;
ckt->CKTtopologyMatrixCOOiRHS = TMALLOC (int, TopologyNNZRHS) ;
ckt->CKTtopologyMatrixCOOjRHS = TMALLOC (int, TopologyNNZRHS) ;
ckt->CKTtopologyMatrixCOOxRHS = TMALLOC (double, TopologyNNZRHS) ;
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) {
/* Topology Matrix Pre-Allocation in CSR format */
ckt->CKTtopologyMatrixCSRp = TMALLOC (int, nz + 1) ;
/* Topology Matrix for the RHS Pre-Allocation in CSR format */
ckt->CKTtopologyMatrixCSRpRHS = TMALLOC (int, (n + 1) + 1) ;
/* Topology Matrix Construction & Topology Matrix for the RHS Construction */
u = 0 ;
uRHS = 0 ;
for (i = 0 ; i < DEVmaxnum ; i++)
if (DEVices [i] && DEVices [i]->DEVtopology && ckt->CKThead [i])
DEVices [i]->DEVtopology (ckt->CKThead [i], ckt, &u, &uRHS) ;
/* CKTdiagGmin Contribute Addition to the Topology Matrix */
k = u ;
for (j = 0 ; j < n ; j++)
{
if (ckt->CKTmatrix->CKTdiag_CSC [j] >= ckt->CKTmatrix->CKTkluAx)
{
ckt->CKTtopologyMatrixCOOi [k] = (int)(ckt->CKTmatrix->CKTdiag_CSC [j] - ckt->CKTmatrix->CKTkluAx) ;
ckt->CKTtopologyMatrixCOOj [k] = ckt->total_n_values ;
ckt->CKTtopologyMatrixCOOx [k] = 1 ;
k++ ;
} }
}
/* Copy the Topology Matrix to the GPU in COO format */ if (ckt->total_n_PtrRHS > 0) {
/* Topology Matrix for the RHS Pre-Allocation in COO format */
ckt->CKTtopologyMatrixCOOiRHS = TMALLOC (int, TopologyNNZRHS) ;
ckt->CKTtopologyMatrixCOOjRHS = TMALLOC (int, TopologyNNZRHS) ;
ckt->CKTtopologyMatrixCOOxRHS = TMALLOC (double, TopologyNNZRHS) ;
/* Topology Matrix for the RHS Pre-Allocation in CSR format */
ckt->CKTtopologyMatrixCSRpRHS = TMALLOC (int, (n + 1) + 1) ;
}
/* Topology Matrix Construction & Topology Matrix for the RHS Construction */
u = 0 ;
uRHS = 0 ;
for (i = 0 ; i < DEVmaxnum ; i++)
if (DEVices [i] && DEVices [i]->DEVtopology && ckt->CKThead [i])
DEVices [i]->DEVtopology (ckt->CKThead [i], ckt, &u, &uRHS) ;
/* COO format to CSR format Conversion using Quick Sort */ /* CKTdiagGmin Contribute Addition to the Topology Matrix */
if (ckt->total_n_Ptr > 0) {
k = u ;
for (j = 0 ; j < n ; j++)
{
if (ckt->CKTmatrix->CKTdiag_CSC [j] >= ckt->CKTmatrix->CKTkluAx)
{
ckt->CKTtopologyMatrixCOOi [k] = (int)(ckt->CKTmatrix->CKTdiag_CSC [j] - ckt->CKTmatrix->CKTkluAx) ;
ckt->CKTtopologyMatrixCOOj [k] = ckt->total_n_values ;
ckt->CKTtopologyMatrixCOOx [k] = 1 ;
k++ ;
}
}
}
Element *TopologyStruct ; /* Copy the Topology Matrix to the GPU in COO format */
TopologyStruct = TMALLOC (Element, TopologyNNZ) ;
for (i = 0 ; i < TopologyNNZ ; i++)
{
TopologyStruct [i].row = ckt->CKTtopologyMatrixCOOi [i] ;
TopologyStruct [i].col = ckt->CKTtopologyMatrixCOOj [i] ;
TopologyStruct [i].val = ckt->CKTtopologyMatrixCOOx [i] ;
}
qsort (TopologyStruct, (size_t)TopologyNNZ, sizeof(Element), Compare) ; /* COO format to CSR format Conversion using Quick Sort */
if (ckt->total_n_Ptr > 0) {
Element *TopologyStruct ;
TopologyStruct = TMALLOC (Element, TopologyNNZ) ;
for (i = 0 ; i < TopologyNNZ ; i++) for (i = 0 ; i < TopologyNNZ ; i++)
{ {
ckt->CKTtopologyMatrixCOOi [i] = TopologyStruct [i].row ; TopologyStruct [i].row = ckt->CKTtopologyMatrixCOOi [i] ;
ckt->CKTtopologyMatrixCOOj [i] = TopologyStruct [i].col ; TopologyStruct [i].col = ckt->CKTtopologyMatrixCOOj [i] ;
ckt->CKTtopologyMatrixCOOx [i] = TopologyStruct [i].val ; TopologyStruct [i].val = ckt->CKTtopologyMatrixCOOx [i] ;
} }
ret = Compress (ckt->CKTtopologyMatrixCOOi, ckt->CKTtopologyMatrixCSRp, nz, TopologyNNZ) ; qsort (TopologyStruct, (size_t)TopologyNNZ, sizeof(Element), Compare) ;
/* COO format to CSR format Conversion for the RHS using Quick Sort */ for (i = 0 ; i < TopologyNNZ ; i++)
{
ckt->CKTtopologyMatrixCOOi [i] = TopologyStruct [i].row ;
ckt->CKTtopologyMatrixCOOj [i] = TopologyStruct [i].col ;
ckt->CKTtopologyMatrixCOOx [i] = TopologyStruct [i].val ;
}
Element *TopologyStructRHS ; ret = Compress (ckt->CKTtopologyMatrixCOOi, ckt->CKTtopologyMatrixCSRp, nz, TopologyNNZ) ;
TopologyStructRHS = TMALLOC (Element, TopologyNNZRHS) ; }
for (i = 0 ; i < TopologyNNZRHS ; i++) /* COO format to CSR format Conversion for the RHS using Quick Sort */
{ if (ckt->total_n_PtrRHS > 0) {
TopologyStructRHS [i].row = ckt->CKTtopologyMatrixCOOiRHS [i] ; Element *TopologyStructRHS ;
TopologyStructRHS [i].col = ckt->CKTtopologyMatrixCOOjRHS [i] ; TopologyStructRHS = TMALLOC (Element, TopologyNNZRHS) ;
TopologyStructRHS [i].val = ckt->CKTtopologyMatrixCOOxRHS [i] ;
}
qsort (TopologyStructRHS, (size_t)TopologyNNZRHS, sizeof(Element), Compare) ; for (i = 0 ; i < TopologyNNZRHS ; i++)
{
TopologyStructRHS [i].row = ckt->CKTtopologyMatrixCOOiRHS [i] ;
TopologyStructRHS [i].col = ckt->CKTtopologyMatrixCOOjRHS [i] ;
TopologyStructRHS [i].val = ckt->CKTtopologyMatrixCOOxRHS [i] ;
}
for (i = 0 ; i < TopologyNNZRHS ; i++) qsort (TopologyStructRHS, (size_t)TopologyNNZRHS, sizeof(Element), Compare) ;
{
ckt->CKTtopologyMatrixCOOiRHS [i] = TopologyStructRHS [i].row ;
ckt->CKTtopologyMatrixCOOjRHS [i] = TopologyStructRHS [i].col ;
ckt->CKTtopologyMatrixCOOxRHS [i] = TopologyStructRHS [i].val ;
}
ret = Compress (ckt->CKTtopologyMatrixCOOiRHS, ckt->CKTtopologyMatrixCSRpRHS, n + 1, TopologyNNZRHS) ; for (i = 0 ; i < TopologyNNZRHS ; i++)
{
ckt->CKTtopologyMatrixCOOiRHS [i] = TopologyStructRHS [i].row ;
ckt->CKTtopologyMatrixCOOjRHS [i] = TopologyStructRHS [i].col ;
ckt->CKTtopologyMatrixCOOxRHS [i] = TopologyStructRHS [i].val ;
}
/* Multiply the Topology Matrix by the M Vector to build the Final CSC Matrix - after the CKTload Call */ ret = Compress (ckt->CKTtopologyMatrixCOOiRHS, ckt->CKTtopologyMatrixCSRpRHS, n + 1, TopologyNNZRHS) ;
}
/* Multiply the Topology Matrix by the M Vector to build the Final CSC Matrix - after the CKTload Call */
} }
#endif #endif
@ -340,7 +344,7 @@ CKTsetup(CKTcircuit *ckt)
} }
#ifdef USE_CUSPICE #ifdef USE_CUSPICE
if (ckt->total_n_Ptr > 0 && ckt->total_n_PtrRHS > 0) { if (ckt->total_n_Ptr > 0 || ckt->total_n_PtrRHS > 0) {
ckt->d_MatrixSize = SMPmatSize (ckt->CKTmatrix) ; ckt->d_MatrixSize = SMPmatSize (ckt->CKTmatrix) ;
status = cuCKTsetup (ckt) ; status = cuCKTsetup (ckt) ;
if (status != 0) if (status != 0)