CFLAGS = $(CFLAGS_BASE) $(CFLAGS_M32) -I../AST
endif
+CFLAGS += -DONLY_MSPACES -DMSPACES
+
#CXXFLAGS = $(CFLAGS) -Wall -Wextra -DEXT_HASH_MAP -Wno-deprecated
#CXXFLAGS = $(CFLAGS) -Wextra -DEXT_HASH_MAP -Wno-deprecated
CXXFLAGS = $(CFLAGS) -DEXT_HASH_MAP -Wno-deprecated
.PHONY: core
core:
- $(MAKE) -C core lib all
+ $(MAKE) -C core all
$(MAKE) -C simp lib all
.PHONY: cryptominisat2
include $(TOP)/scripts/Makefile.common
MTL = ../mtl
-SOURCES = Solver.C
-OBJECTS = $(SOURCES:.C=.o)
-LIB = libminisat.a
+SOURCES = Solver.C dlmalloc.c
+OBJECTS = Solver.o dlmalloc.o
CFLAGS += -I$(MTL) -DEXT_HASH_MAP -ffloat-store $(CFLAGS_M32) -c
-EXEC = minisat
-LFLAGS = -lz
-all: $(LIB) #$(EXEC)
-lib: $(LIB)
-
-$(LIB): $(OBJECTS)
- rm -f $@
- ar cq $@ $(OBJECTS)
- ranlib $@
- cp $(LIB) ../
- cp $(OBJECTS) ../
+all: $(OBJECTS)
clean:
rm -f $(OBJECTS) $(LIB)
namespace MINISAT {
+/// This creates a separate "memory space" for the clauses built by minisat. This
+/// stops the clauses being mixed in with the rest of STPs data (like ASTNodes).
+/// The memory spaces are separate heaps. More memory is used, but the SAT solver's
+/// clauses are all lumped together in memory so there are fewer data cache misses.
+#if 1
+mspace tlms =0;
+
+void* tlmalloc(size_t bytes) {
+ if (tlms == 0) tlms = create_mspace(0, 0);
+ return mspace_malloc(tlms, bytes);
+ }
+
+void tlfree(void* mem) { mspace_free(tlms, mem); }
+#else
+ void* tlmalloc(size_t bytes) { return malloc(bytes);}
+ void tlfree(void* mem) { free(tlms); }
+#endif
+///
+
+
//=================================================================================================
// Constructor/Destructor:
Solver::~Solver()
{
- for (int i = 0; i < learnts.size(); i++) free(learnts[i]);
- for (int i = 0; i < clauses.size(); i++) free(clauses[i]);
+ for (int i = 0; i < learnts.size(); i++) tlfree(learnts[i]);
+ for (int i = 0; i < clauses.size(); i++) tlfree(clauses[i]);
}
void Solver::removeClause(Clause& c) {
detachClause(c);
- free(&c); }
+ tlfree(&c); }
bool Solver::satisfied(const Clause& c) const {
#include <cassert>
#include <stdint.h>
+#define ONLY_MSPACES 1
+#include "dlmalloc.h"
namespace MINISAT{
+void* tlmalloc(size_t bytes);
+void tlfree(void* mem);
+
//=================================================================================================
// Variables, literals, lifted booleans, clauses:
friend Clause* Clause_new(const V& ps, bool learnt = false) {
assert(sizeof(Lit) == sizeof(uint32_t));
assert(sizeof(float) == sizeof(uint32_t));
- void* mem = malloc(sizeof(Clause) + sizeof(uint32_t)*(ps.size()));
+ void* mem = tlmalloc(sizeof(Clause) + sizeof(uint32_t)*(ps.size()));
return new (mem) Clause(ps, learnt); }
int size () const { return size_etc >> 3; }
include $(TOP)/scripts/Makefile.common
MTL = ../mtl
-SOURCES = SimpSolver.C ../core/Solver.C
+SOURCES = SimpSolver.C ../core/Solver.C
OBJECTS = $(SOURCES:.C=.o)
+OBJECTS += ../core/dlmalloc.o
LIB = libminisat.a
-CFLAGS += -I$(MTL) -DEXT_HASH_MAP -ffloat-store $(CFLAGS_M32) -c
+CFLAGS += -I$(MTL) -DEXT_HASH_MAP -ffloat-store $(CFLAGS_M32) -c -DMSPACES
EXEC = minisat
LFLAGS = -lz