24#ifdef ABC_USE_PTHREADS
27#include "../lib/pthread.h"
41#ifndef ABC_USE_PTHREADS
47static inline word * Gia_ParTestObj(
Gia_Man_t *
p,
int Id ) {
return (
word *)
p->pData + Id *
p->iData; }
69 word * pData, Sign = 0;
73 pData = Gia_ParTestObj(
p, Gia_ObjId(
p, pObj) );
74 for ( i = 0; i <
p->iData; i++ )
77 Abc_TtPrintHexRev( stdout, &Sign, 6 );
98 pData = Gia_ParTestObj(
p, Gia_ObjId(
p, pObj) );
99 for ( i = 0; i <
p->iData; i++ )
103void Gia_ParTestSimulateObj(
Gia_Man_t *
p,
int Id )
106 word * pData, * pData0, * pData1;
108 if ( Gia_ObjIsAnd(pObj) )
110 pData = Gia_ParTestObj(
p, Id );
111 pData0 = Gia_ParTestObj(
p, Gia_ObjFaninId0(pObj, Id) );
112 pData1 = Gia_ParTestObj(
p, Gia_ObjFaninId1(pObj, Id) );
113 if ( Gia_ObjFaninC0(pObj) )
115 if ( Gia_ObjFaninC1(pObj) )
116 for ( i = 0; i <
p->iData; i++ )
117 pData[i] = ~(pData0[i] | pData1[i]);
119 for ( i = 0; i <
p->iData; i++ )
120 pData[i] = ~pData0[i] & pData1[i];
124 if ( Gia_ObjFaninC1(pObj) )
125 for ( i = 0; i <
p->iData; i++ )
126 pData[i] = pData0[i] & ~pData1[i];
128 for ( i = 0; i <
p->iData; i++ )
129 pData[i] = pData0[i] & pData1[i];
132 else if ( Gia_ObjIsCo(pObj) )
134 pData = Gia_ParTestObj(
p, Id );
135 pData0 = Gia_ParTestObj(
p, Gia_ObjFaninId0(pObj, Id) );
136 if ( Gia_ObjFaninC0(pObj) )
137 for ( i = 0; i <
p->iData; i++ )
138 pData[i] = ~pData0[i];
140 for ( i = 0; i <
p->iData; i++ )
141 pData[i] = pData0[i];
143 else if ( Gia_ObjIsCi(pObj) )
146 else if ( Gia_ObjIsConst0(pObj) )
148 pData = Gia_ParTestObj(
p, Id );
149 for ( i = 0; i <
p->iData; i++ )
160 Gia_ParTestSimulateInit(
p );
162 Gia_ParTestSimulateObj(
p, i );
164 Gia_ParTestFree(
p );
183 vCounts = Vec_IntAlloc( Gia_ManObjNum(
p) );
186 if ( Gia_ObjIsAnd(pObj) )
187 Vec_IntPush( vCounts, 2 );
188 else if ( Gia_ObjIsCo(pObj) )
189 Vec_IntPush( vCounts, 1 );
191 Vec_IntPush( vCounts, 0 );
193 assert( Vec_IntSize(vCounts) == Gia_ManObjNum(
p) );
208#define PAR_THR_MAX 100
209typedef struct Par_ThData_t_
215void * Gia_ParWorkerThread(
void * pArg )
217 Par_ThData_t * pThData = (Par_ThData_t *)pArg;
218 volatile int * pPlace = &pThData->Status;
221 while ( *pPlace == 0 );
222 assert( pThData->Status == 1 );
223 if ( pThData->Id == -1 )
225 pthread_exit( NULL );
229 assert( pThData->Id >= 0 );
230 Gia_ParTestSimulateObj( pThData->p, pThData->Id );
241 int i, k, iFan, status, nCountFanins;
245 Gia_ParTestSimulateInit(
p );
247 vStack = Vec_IntAlloc( 1000 );
249 Vec_IntPush( vStack, iFan );
250 Vec_IntPush( vStack, 0 );
252 vFanins = Gia_ManCreateFaninCounts(
p );
253 nCountFanins = Vec_IntSum(vFanins);
255 for ( i = 0; i < nProcs; i++ )
259 ThData[i].Status = 0;
260 status = pthread_create( WorkerThread + i, NULL, Gia_ParWorkerThread, (
void *)(ThData + i) );
assert( status == 0 );
262 while ( nCountFanins > 0 || Vec_IntSize(vStack) > 0 )
264 for ( i = 0; i < nProcs; i++ )
266 if ( ThData[i].Status )
268 assert( ThData[i].Status == 0 );
269 if ( ThData[i].Id >= 0 )
273 assert( Vec_IntEntry(vFanins, iFan) > 0 );
274 if ( Vec_IntAddToEntry(vFanins, iFan, -1) == 0 )
275 Vec_IntPush( vStack, iFan );
276 assert( nCountFanins > 0 );
281 if ( Vec_IntSize(vStack) > 0 )
283 ThData[i].Id = Vec_IntPop( vStack );
284 ThData[i].Status = 1;
291 printf(
"%d -> %d ", k, iFan );
298 for ( i = 0; i < nProcs; i++ )
299 if ( ThData[i].Status )
304 for ( i = 0; i < nProcs; i++ )
306 assert( ThData[i].Status == 0 );
308 ThData[i].Status = 1;
311 Vec_IntFree( vStack );
312 Vec_IntFree( vFanins );
314 Gia_ParTestFree(
p );
332 printf(
"Trying with %d words and %d threads. ",
nWords, nProcs );
333 printf(
"Memory usage = %.2f MB\n", (8.0*
nWords*Gia_ManObjNum(
p))/(1<<20) );
336 Gia_ParTestSimulate(
p,
nWords );
337 Abc_PrintTime( 1,
"Regular time", Abc_Clock() - clk );
340 Gia_ParTestSimulate2(
p,
nWords, nProcs );
341 Abc_PrintTime( 1,
"Special time", Abc_Clock() - clk );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define PAR_THR_MAX
DECLARATIONS ///.
void Gia_ManStaticFanoutStart(Gia_Man_t *p)
void Gia_ManStaticFanoutStop(Gia_Man_t *p)
word Gia_ManRandomW(int fReset)
struct Gia_Obj_t_ Gia_Obj_t
void Gia_ObjPrint(Gia_Man_t *p, Gia_Obj_t *pObj)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ObjForEachFanoutStaticId(p, Id, FanId, i)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
unsigned __int64 word
DECLARATIONS ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryReverse(vVec, pEntry, i)