Commit 6488962c by xiaotong

reduce memory footprint of XMem freeotf

parent 1fada737
......@@ -167,6 +167,22 @@ void T2TTrainer::Train(const char * fn, T2TModel * model)
/* get probabilities */
float prob = GetProb(&output, &gold, NULL);
MTYPE totalUsed = 0;
MTYPE totalSize = 0;
for (int i = 0; i <= mem->curBlockID; i++) {
totalSize += mem->blocks[i].size;
totalUsed += mem->blocks[i].used;
if (totalSize <= 0) {
int nnn = 0;
}
if (totalUsed <= 0) {
int nnn = 0;
}
}
//fprintf(stderr, "%d(%ld,%ld,%f)\n", mem->curBlockID, totalUsed, totalSize, (float)totalUsed/totalSize);
loss += -prob;
wordCount += wc;
wordCountTotal += wc;
......
......@@ -532,7 +532,7 @@ release a piece of memory
*/
void XMem::Release(void * p, MTYPE size, MTYPE code)
{
if(code == signature)
//if(code == signature)
Release(devID, p, size);
}
......@@ -667,6 +667,7 @@ void * XMem::AllocStandard(int myDevID, MTYPE mySize, bool myIsRebuiltIndex)
hit->size = mySize;
hit->head.state = 2;
hit->pReal = beg;
blocks[hit->head.blockID].used += mySize;
RemoveFreeIndexNode(hit);
AddAllocIndexNode(hit);
......@@ -731,6 +732,7 @@ void * XMem::AllocStandard(int myDevID, MTYPE mySize, bool myIsRebuiltIndex)
header.blockID = bi;
block->head = &header;
block->used = 0;
result = AllocStandard(myDevID, mySize, myIsRebuiltIndex);
break;
......@@ -917,6 +919,8 @@ void XMem::ReleaseStandard(int myDevID, void * p, MTYPE size)
RemoveAllocIndexNode(hit);
AddFreeIndexNode(hit);
blocks[hit->head.blockID].used -= hit->head.size;
}
/* rebuild index to merge small fragments of memory and free the block with no use */
......@@ -934,6 +938,7 @@ void XMem::RebuildIndex()
CheckNTErrors(head->size <= block->size, "Illegal memory block!");
block->head = NULL;
block->used = 0;
/* if the block is not used, we delete it */
if(head->state == 1 && head->size == block->size){
......@@ -976,7 +981,8 @@ void XMem::RebuildIndex()
/* make a new index node */
MPieceNode * newNode = memIndex2 + nodeNumUsed2++;
newNode->p = p;
newNode->size = (char*)p + node->size - (char*)GetPitchedAddress((char*)p, MY_PITCH);
newNode->size = (char*)p + head->size -
( head->state == 1 ? (char*)GetPitchedAddress((char*)p, MY_PITCH) : head->indexNode->pReal);
newNode->pre = NULL;
newNode->next = NULL;
......@@ -1004,6 +1010,7 @@ void XMem::RebuildIndex()
newNode->pReal = head->indexNode->pReal;
MPieceNode * entry = memIndex2 + indexEntryNum + FindIndexEntry(newNode->size);
AddAllocIndexNode(newNode, entry);
block->used += head->size;
}
if(newLast == NULL)
......
......@@ -162,6 +162,7 @@ XTensor::XTensor(const XTensor &reference)
devID = reference.devID;
mem = reference.mem;
data = reference.data;
signature = reference.signature;
/* what we really want to do is "reference.data = NULL;"
As "reference" is constant, we cannot reset reference.data
......@@ -299,6 +300,7 @@ XTensor& XTensor::operator= (const XTensor& tensor)
newTensor->SetTMP();
newTensor->data = data;
newTensor->dataHost = dataHost;
newTensor->signature = tensor.signature;
XLink::Replace(this, newTensor);
XLink::ClearOutgoing(this);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论