提交 cd6bc7f0 编写于 作者: 饶先宏's avatar 饶先宏

202108082148 改进多线程,尽可能用原子操作替代threadlock

上级 010a1efa
......@@ -275,6 +275,10 @@ IHDL4SEModuleVar* hdl4seCreateModule3(HOBJECT parent, const char* clsid, const c
#define MODULE_DATA_TYPE M_ID(sHDL4SE_data)
#define MODULE_DATA_STRUCT M_ID(_sHDL4SE_data)
#define DEFINE_FUNC_DEPEND(funcname, dependlist) \
static const char * __##funcname##_depend_list = dependlist; \
static int funcname(MODULE_DATA_TYPE* pobj) {
#define DEFINE_FUNC(funcname) \
static int funcname(MODULE_DATA_TYPE* pobj) {
......
......@@ -74,7 +74,7 @@ MODULE_DECLARE(hdl4se_fifo)
int reset;
END_MODULE_DECLARE(hdl4se_fifo)
DEFINE_FUNC(hdl4se_fifo_gen_bReadData) {
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_bReadData, "readpos") {
unsigned int readaddr = vget(readpos);
var readdata = Var(bReadData);
unsigned int j;
......@@ -83,15 +83,150 @@ DEFINE_FUNC(hdl4se_fifo_gen_bReadData) {
}
} END_DEFINE_FUNC
DEFINE_FUNC(hdl4se_fifo_gen_wDataValid) {
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_wDataValid, "wReadEn") {
VAssign(wDataValid, wReadEn);
} END_DEFINE_FUNC
DEFINE_FUNC(hdl4se_fifo_gen_wWriteEnable) {
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_wWriteEnable, "wWriteEn") {
VAssign(wWriteEnable, wWriteEn);
} END_DEFINE_FUNC
DEFINE_FUNC(hdl4se_fifo_ClkTick) {
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_readpos, "readpos, wRead, wReadEn") {
if (pobj->reset == 0) {
vput(readpos, 0);
}
else {
if (vget(wRead) && vget(wReadEn)) {
unsigned int readaddr = vget(readpos);
readaddr = readaddr + 1;
if (readaddr >= pobj->depth)
readaddr = 0;
vput(readpos, readaddr);
}
}
} END_DEFINE_FUNC
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_writepos, "writepos, wWrite, wWriteEn") {
if (pobj->reset == 0) {
vput(writepos, 0);
}
else {
if (vget(wWrite) && vget(wWriteEn)) {
unsigned int writeaddr = vget(writepos);
writeaddr = writeaddr + 1;
if (writeaddr >= pobj->depth)
writeaddr = 0;
vput(writepos, writeaddr);
}
}
} END_DEFINE_FUNC
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_outputcount, "wRead, wReadEn, outputcount") {
if (pobj->reset == 0) {
vput(outputcount, 0);
}
else {
if (vget(wRead) && vget(wReadEn)) {
vput(outputcount, vget(outputcount) + 1);
}
}
} END_DEFINE_FUNC
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_inputcount, "wWrite, wWriteEn, inputcount") {
if (pobj->reset == 0) {
vput(inputcount, 0);
}
else {
if (vget(wWrite) && vget(wWriteEn)) {
vput(inputcount, vget(inputcount) + 1);
}
}
} END_DEFINE_FUNC
DEFINE_FUNC_DEPEND(hdl4se_fifo_count, "readpos, writepos") {
unsigned int readaddr = vget(readpos);
unsigned int writeaddr = vget(writepos);
unsigned int datacount;
if (writeaddr < readaddr)
datacount = writeaddr + pobj->depth - readaddr;
else
datacount = writeaddr - readaddr;
vput(count, datacount);
} END_DEFINE_FUNC
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_maxcount, "readpos, writepos, maxcount") {
if (pobj->reset == 0) {
vput(maxcount, 0);
}
else {
unsigned int readaddr = vget(readpos);
unsigned int writeaddr = vget(writepos);
unsigned int datacount;
unsigned int maxcount;
if (writeaddr < readaddr)
datacount = writeaddr + pobj->depth - readaddr;
else
datacount = writeaddr - readaddr;
maxcount = vget(maxcount);
if (maxcount < datacount) {
maxcount = datacount;
vput(maxcount, maxcount);
}
}
} END_DEFINE_FUNC
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_wReadEn, "readpos, writepos, wRead, wReadEn, wWrite, wWriteEn") {
unsigned int readaddr = vget(readpos);
unsigned int writeaddr = vget(writepos);
if (vget(wRead) && vget(wReadEn)) {
readaddr = readaddr + 1;
if (readaddr >= pobj->depth)
readaddr = 0;
}
vput(wReadEn, (readaddr != writeaddr) ? 1 : 0);
} END_DEFINE_FUNC
DEFINE_FUNC_DEPEND(hdl4se_fifo_gen_wWriteEn, "readpos, writepos, wRead, wReadEn, wWrite, wWriteEn") {
if (pobj->reset == 0) {
vput(wWriteEn, 0);
}
else {
unsigned int readaddr = vget(readpos);
unsigned int writeaddr = vget(writepos);
unsigned int datacount;
if (writeaddr < readaddr)
datacount = writeaddr + pobj->depth - readaddr;
else
datacount = writeaddr - readaddr;
vput(wWriteEn, (datacount >= pobj->depth - 4) ? 0 : 1);
}
} END_DEFINE_FUNC
#define DEPEND_OPT 0
#if DEPEND_OPT
DEFINE_FUNC_DEPEND(hdl4se_fifo_ClkTick, "nwReset, readpos, writepos, wRead, wReadEn, outputcount, wWrite, wWriteEn, inputcount, maxcount") {
if (pobj->reset == 0) {
if (vget(nwReset) != 0) {
pobj->reset = 1;
}
}
else {
if (vget(wWrite) && vget(wWriteEn)) {
int j;
unsigned int writeaddr = vget(writepos);
var writedata = Var(bWriteData);
for (j = 0; j < pobj->wordsize; j++) {
pobj->fifo_data[writeaddr * pobj->wordsize + j] = varGetBits32(writedata, j);
}
}
}
} END_DEFINE_FUNC
#else
DEFINE_FUNC_DEPEND(hdl4se_fifo_ClkTick, "nwReset, readpos, writepos, wRead, wReadEn, outputcount, wWrite, wWriteEn, inputcount, maxcount") {
if (pobj->reset == 0) {
if (vget(nwReset) == 0) {
vput(readpos, 0);
......@@ -144,6 +279,7 @@ DEFINE_FUNC(hdl4se_fifo_ClkTick) {
vput(wWriteEn, (datacount >= pobj->depth - 4) ? 0 : 1);
}
} END_DEFINE_FUNC
#endif
DEFINE_FUNC(M_ID(deinit)) {
if (pobj->fifo_data != NULL)
......@@ -171,14 +307,25 @@ MODULE_INIT(hdl4se_fifo)
GPORT_OUT(wWriteEnable, 1, hdl4se_fifo_gen_wWriteEnable);
PORT_IN(wWrite, 1);
PORT_IN(bWriteData, pobj->width);
#if DEPEND_OPT
GREG(readpos, 32, hdl4se_fifo_gen_readpos);
GREG(writepos, 32, hdl4se_fifo_gen_writepos);
GREG(wReadEn, 1, hdl4se_fifo_gen_wReadEn);
GREG(wWriteEn, 1, hdl4se_fifo_gen_wWriteEn);
GREG(inputcount, 32, hdl4se_fifo_gen_inputcount);
GREG(outputcount, 32, hdl4se_fifo_gen_outputcount);
GWIRE(count, 32, hdl4se_fifo_count);
GREG(maxcount, 32, hdl4se_fifo_gen_maxcount);
#else
REG(readpos, 32);
REG(writepos, 32);
REG(wReadEn, 1);
REG(wWriteEn, 1);
REG(inputcount, 32);
REG(outputcount, 32);
REG(count, 32);
WIRE(count, 32);
REG(maxcount, 32);
#endif
CLKTICK_FUNC(hdl4se_fifo_ClkTick);
DEINIT_FUNC(M_ID(deinit));
......
......@@ -92,10 +92,13 @@ static int gen_none(void * p)
static MODULE_FUNC get_gen_func_and_set_none(ModuleVariable* var)
{
MODULE_FUNC genfunc;
genfunc = LOCKED_SWAP_POINTER(var->moduledata->cur_funcs.array[var->genfuncindex], gen_none);
/*
threadlockLock(var->moduledata->lock);
genfunc = (MODULE_FUNC)var->moduledata->cur_funcs.array[var->genfuncindex];
var->moduledata->cur_funcs.array[var->genfuncindex] = gen_none;
threadlockUnlock(var->moduledata->lock);
*/
return genfunc;
}
......
......@@ -470,6 +470,36 @@ softmax_168 complete
0.0356 n04505470 typewriter keyboard
clocks: 1818624, TSPD=9937.836066cps, LSPD=16384.000000cps
get_func_and_set_none:
clocks: 1802240, TSPD=10298.514286cps, LSPD=8192.000000cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks: 1818624, TSPD=10274.711864cps, LSPD=8192.000000cps
fifo gen_depend:
clocks: 1802240, TSPD=8966.368159cps, LSPD=8192.000000cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks: 1818624, TSPD=8958.738916cps, LSPD=8192.000000cps
gen_depend + get_func_and_set_none:
clocks: 1802240, TSPD=9586.382979cps, LSPD=16384.000000cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks: 1818624, TSPD=9571.705263cps, LSPD=8192.000000cps
threadcount=8
clocks: 1867776, TSPD=9529.469388cps, LSPD=16384.000000cps
softmax_168 complete
......
......@@ -56,6 +56,31 @@ int threadlockDestroy(THREADLOCK lock);
void* mt_malloc(size_t size);
void mt_free(void*);
#ifdef WIN32
#include "windows.h"
#define LOCKED_INCREMENT(p) InterlockedIncrement(&p)
#define LOCKED_DECREMENT(p) InterlockedDecrement(&p)
#define LOCKED_SWAP_POINTER(p, v) InterlockedExchangePointer(&p, v)
#endif
#ifdef __GNUC__
#define LOCKED_INCREMENT(p) __sync_fetch_and_add(&p, 1);
#define LOCKED_DECREMENT(p) __sync_fetch_and_sub(&p, 1);
#define LOCKED_SWAP_POINTER(p, v) __sync_val_compare_and_swap(&p, p, v)
#endif
#ifndef LOCKED_INCREMENT
#define LOCKED_INCREMENT(p) p++
#define LOCKED_DECREMENT(p) p--
static void* locked_swap_pointer(void** p, void* v)
{
void* ret = v;
*p = v;
return ret;
}
#define LOCKED_SWAP_POINTER(p, v) locked_swap_pointer(&p, v)
#endif
#endif
#ifdef __cplusplus
......
......@@ -814,7 +814,6 @@ returnnum:
{/* 返回栈顶 */
IDListVar* stacktop;
IBigNumber** stacktopnum = NULL;
int ret;
*index = i;
stacktop = calcstack.__dlist_pLast;
ASSERT(stacktop != &calcstack);
......@@ -906,7 +905,7 @@ static int expr_verilognode_procheck(HOBJECT object, HOBJECT module, void * para
return 1;
case EXPRTYPE_STRING:
pobj->data.isconst = 0;
pobj->data.width = strlen(pobj->data.value->string) * 8;
pobj->data.width = (int)strlen(pobj->data.value->string) * 8;
return 0;
break;
case EXPRTYPE_PARAM:
......@@ -2002,7 +2001,7 @@ const char * verilogparseGenExprStr(HOBJECT expr, HOBJECT module)
if (width <= 32)
sprintf(hdl4se_parse_logbuf(), "(VREAD_U32(%s) >> %d) & 0x%x", select->name->string, v_lsb, (0xffffffff >> (32 - (v_msb - v_lsb + 1))));
else
sprintf(hdl4se_parse_logbuf(), "(VREAD_U64(%s) >> %d) & 0x%xllu", select->name->string, v_lsb, (0xffffffffffffffffllu >> (64 - (v_msb - v_lsb + 1))));
sprintf(hdl4se_parse_logbuf(), "(VREAD_U64(%s) >> %d) & 0x%llxllu", select->name->string, v_lsb, (0xffffffffffffffffllu >> (64 - (v_msb - v_lsb + 1))));
}
}
else {
......@@ -2033,7 +2032,7 @@ const char * verilogparseGenExprStr(HOBJECT expr, HOBJECT module)
return NULL;
}
const char * verilogparseGenExprStrVar(HOBJECT expr, HOBJECT module, const char * linehead)
const char * verilogparseGenExprStrVar(HOBJECT expr, HOBJECT module, char * linehead)
{
int width;
sExpr* pobj;
......@@ -2075,7 +2074,7 @@ const char * verilogparseGenExprStrVar(HOBJECT expr, HOBJECT module, const char
}
}
} else {
sprintf(hdl4se_parse_logbuf(), "varConstStr(\"\")", pobj->data.value->string);
sprintf(hdl4se_parse_logbuf(), "varConstStr(\"%s\")", pobj->data.value->string);
}
objectRelease(number);
return hdl4se_parse_logbuf();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册