diff --git a/sdk/likely.h b/sdk/likely.h index 2c9d3fd..a43991f 100644 --- a/sdk/likely.h +++ b/sdk/likely.h @@ -6,15 +6,15 @@ #if defined BR_LIBRARY # if defined _WIN32 || defined __CYGWIN__ -# define BR_EXPORT __declspec(dllexport) +# define LIKELY_EXPORT __declspec(dllexport) # else -# define BR_EXPORT __attribute__((visibility("default"))) +# define LIKELY_EXPORT __attribute__((visibility("default"))) # endif #else # if defined _WIN32 || defined __CYGWIN__ -# define BR_EXPORT __declspec(dllimport) +# define LIKELY_EXPORT __declspec(dllimport) # else -# define BR_EXPORT +# define LIKELY_EXPORT # endif #endif @@ -73,39 +73,29 @@ struct likely_matrix f64 = 64 + Floating + Signed }; }; -BR_EXPORT int likely_bits(const likely_matrix *m); -BR_EXPORT void likely_set_bits(likely_matrix *m, int bits); -BR_EXPORT bool likely_is_floating(const likely_matrix *m); -BR_EXPORT void likely_set_floating(likely_matrix *m, bool is_floating); -BR_EXPORT bool likely_is_signed(const likely_matrix *m); -BR_EXPORT void likely_set_signed(likely_matrix *m, bool is_signed); -BR_EXPORT int likely_type(const likely_matrix *m); -BR_EXPORT void likely_set_type(likely_matrix *m, int type); -BR_EXPORT bool likely_is_single_channel(const likely_matrix *m); -BR_EXPORT void likely_set_single_channel(likely_matrix *m, bool is_single_channel); -BR_EXPORT bool likely_is_single_column(const likely_matrix *m); -BR_EXPORT void likely_set_single_column(likely_matrix *m, bool is_single_column); -BR_EXPORT bool likely_is_single_row(const likely_matrix *m); -BR_EXPORT void likely_set_single_row(likely_matrix *m, bool is_single_row); -BR_EXPORT bool likely_is_single_frame(const likely_matrix *m); -BR_EXPORT void likely_set_single_frame(likely_matrix *m, bool is_single_frame); -BR_EXPORT uint32_t likely_elements(const likely_matrix *m); -BR_EXPORT uint32_t likely_bytes(const likely_matrix *m); +LIKELY_EXPORT int likely_bits(const likely_matrix *m); +LIKELY_EXPORT void likely_set_bits(likely_matrix *m, int bits); +LIKELY_EXPORT bool likely_is_floating(const likely_matrix *m); +LIKELY_EXPORT void likely_set_floating(likely_matrix *m, bool is_floating); +LIKELY_EXPORT bool likely_is_signed(const likely_matrix *m); +LIKELY_EXPORT void likely_set_signed(likely_matrix *m, bool is_signed); +LIKELY_EXPORT int likely_type(const likely_matrix *m); +LIKELY_EXPORT void likely_set_type(likely_matrix *m, int type); +LIKELY_EXPORT bool likely_is_single_channel(const likely_matrix *m); +LIKELY_EXPORT void likely_set_single_channel(likely_matrix *m, bool is_single_channel); +LIKELY_EXPORT bool likely_is_single_column(const likely_matrix *m); +LIKELY_EXPORT void likely_set_single_column(likely_matrix *m, bool is_single_column); +LIKELY_EXPORT bool likely_is_single_row(const likely_matrix *m); +LIKELY_EXPORT void likely_set_single_row(likely_matrix *m, bool is_single_row); +LIKELY_EXPORT bool likely_is_single_frame(const likely_matrix *m); +LIKELY_EXPORT void likely_set_single_frame(likely_matrix *m, bool is_single_frame); +LIKELY_EXPORT uint32_t likely_elements(const likely_matrix *m); +LIKELY_EXPORT uint32_t likely_bytes(const likely_matrix *m); typedef void (*likely_unary_function)(const likely_matrix *src, likely_matrix *dst); typedef void (*likely_binary_function)(const likely_matrix *srcA, const likely_matrix *srcB, likely_matrix *dst); -BR_EXPORT likely_unary_function likely_make_unary_function(const char *description); -BR_EXPORT likely_binary_function likely_make_binary_function(const char *description); - -typedef uint32_t (*likely_unary_allocation)(const likely_matrix *src, likely_matrix *dst); -typedef uint32_t (*likely_binary_allocation)(const likely_matrix *srcA, const likely_matrix *srcB, likely_matrix *dst); -BR_EXPORT likely_unary_allocation likely_make_unary_allocation(const char *description, const likely_matrix *src); -BR_EXPORT likely_binary_allocation likely_make_binary_allocation(const char *description, const likely_matrix *src_a, const likely_matrix *src_b); - -typedef void (*likely_unary_kernel)(const likely_matrix *src, likely_matrix *dst, uint32_t size); -typedef void (*likely_binary_kernel)(const likely_matrix *srcA, const likely_matrix *srcB, likely_matrix *dst, uint32_t size); -BR_EXPORT likely_unary_kernel likely_make_unary_kernel(const char *description, const likely_matrix *src); -BR_EXPORT likely_binary_kernel likely_make_binary_kernel(const char *description, const likely_matrix *src_a, const likely_matrix *src_b); +LIKELY_EXPORT likely_unary_function likely_make_unary_function(const char *description); +LIKELY_EXPORT likely_binary_function likely_make_binary_function(const char *description); #ifdef __cplusplus } @@ -162,16 +152,6 @@ typedef likely_binary_function BinaryFunction; inline UnaryFunction makeUnaryFunction(const char *description) { return likely_make_unary_function(description); } inline BinaryFunction makeBinaryFunction(const char *description) { return likely_make_binary_function(description); } -typedef likely_unary_allocation UnaryAllocation; -typedef likely_binary_allocation BinaryAllocation; -inline UnaryAllocation makeUnaryAllocation(const char *description, const Matrix &src) { return likely_make_unary_allocation(description, &src); } -inline BinaryAllocation makeBinaryAllocation(const char *description, const Matrix &srcA, const Matrix &srcB) { return likely_make_binary_allocation(description, &srcA, &srcB); } - -typedef likely_unary_kernel UnaryKernel; -typedef likely_binary_kernel BinaryKernel; -inline UnaryKernel makeUnaryKernel(const char *description, const Matrix &src) { return likely_make_unary_kernel(description, &src); } -inline BinaryKernel makeBinaryKernel(const char *description, const Matrix &srcA, const Matrix &srcB) { return likely_make_binary_kernel(description, &srcA, &srcB); } - } // namespace likely #endif // __cplusplus diff --git a/sdk/plugins/llvm.cpp b/sdk/plugins/llvm.cpp index 5f6e9eb..9e5d905 100644 --- a/sdk/plugins/llvm.cpp +++ b/sdk/plugins/llvm.cpp @@ -27,12 +27,50 @@ using namespace br; using namespace cv; using namespace llvm; +typedef uint32_t (*likely_unary_allocation)(const likely_matrix *src, likely_matrix *dst); +typedef uint32_t (*likely_binary_allocation)(const likely_matrix *srcA, const likely_matrix *srcB, likely_matrix *dst); +typedef void (*likely_unary_kernel)(const likely_matrix *src, likely_matrix *dst, uint32_t size); +typedef void (*likely_binary_kernel)(const likely_matrix *srcA, const likely_matrix *srcB, likely_matrix *dst, uint32_t size); + static Module *TheModule = NULL; static ExecutionEngine *TheExecutionEngine = NULL; static FunctionPassManager *TheFunctionPassManager = NULL; static FunctionPassManager *TheExtraFunctionPassManager = NULL; static StructType *TheMatrixStruct = NULL; +static void likely_initialize() +{ + InitializeNativeTarget(); + + TheModule = new Module("likely", getGlobalContext()); + + std::string error; + TheExecutionEngine = EngineBuilder(TheModule).setEngineKind(EngineKind::JIT).setErrorStr(&error).create(); + if (TheExecutionEngine == NULL) + qFatal("Failed to create LLVM ExecutionEngine with error: %s", error.c_str()); + + TheFunctionPassManager = new FunctionPassManager(TheModule); + TheFunctionPassManager->add(createVerifierPass(PrintMessageAction)); + TheFunctionPassManager->add(createEarlyCSEPass()); + TheFunctionPassManager->add(createInstructionCombiningPass()); + TheFunctionPassManager->add(createDeadCodeEliminationPass()); + TheFunctionPassManager->add(createGVNPass()); + TheFunctionPassManager->add(createDeadInstEliminationPass()); + + TheExtraFunctionPassManager = new FunctionPassManager(TheModule); + TheExtraFunctionPassManager->add(createPrintFunctionPass("--------------------------------------------------------------------------------", &errs())); +// TheExtraFunctionPassManager->add(createLoopUnrollPass(INT_MAX,8)); + + TheMatrixStruct = StructType::create("Matrix", + Type::getInt8PtrTy(getGlobalContext()), // data + Type::getInt32Ty(getGlobalContext()), // channels + Type::getInt32Ty(getGlobalContext()), // columns + Type::getInt32Ty(getGlobalContext()), // rows + Type::getInt32Ty(getGlobalContext()), // frames + Type::getInt16Ty(getGlobalContext()), // hash + NULL); +} + static QString MatrixToString(const likely_matrix *m) { return QString("%1%2%3%4%5%6%7").arg(QString::number(likely_bits(m)), (likely_is_signed(m) ? "s" : "u"), (likely_is_floating(m) ? "f" : "i"), @@ -353,6 +391,8 @@ public: likely_unary_function getFunction() const { + if (TheModule == NULL) likely_initialize(); + const QString name = mangledName(); Function *function = TheModule->getFunction(qPrintable(name)); @@ -537,7 +577,7 @@ private: const QString args = arguments().join(","); if (!argsLUT.contains(args)) argsLUT.insert(args, argsLUT.size()); int uid = argsLUT.value(args); - return "jitcv_" + objectName() + (args.isEmpty() ? QString() : QString::number(uid)); + return "likely_" + objectName() + (args.isEmpty() ? QString() : QString::number(uid)); } QString mangledName(const likely_matrix &src) const @@ -583,7 +623,7 @@ QHash UnaryTransform::fileTable; //private: // QString mangledName(const Matrix &srcA, const Matrix &srcB) const // { -// return "jitcv_" + objectName() + "_" + MatrixToString(srcA) + "_" + MatrixToString(srcB); +// return "likely_" + objectName() + "_" + MatrixToString(srcA) + "_" + MatrixToString(srcB); // } // Function *compile(const Matrix &m, const Matrix &n) const @@ -1051,36 +1091,6 @@ class LLVMInitializer : public Initializer void initialize() const { - InitializeNativeTarget(); - - TheModule = new Module("jitcv", getGlobalContext()); - - std::string error; - TheExecutionEngine = EngineBuilder(TheModule).setEngineKind(EngineKind::JIT).setErrorStr(&error).create(); - if (TheExecutionEngine == NULL) - qFatal("Failed to create LLVM ExecutionEngine with error: %s", error.c_str()); - - TheFunctionPassManager = new FunctionPassManager(TheModule); - TheFunctionPassManager->add(createVerifierPass(PrintMessageAction)); - TheFunctionPassManager->add(createEarlyCSEPass()); - TheFunctionPassManager->add(createInstructionCombiningPass()); - TheFunctionPassManager->add(createDeadCodeEliminationPass()); - TheFunctionPassManager->add(createGVNPass()); - TheFunctionPassManager->add(createDeadInstEliminationPass()); - - TheExtraFunctionPassManager = new FunctionPassManager(TheModule); - TheExtraFunctionPassManager->add(createPrintFunctionPass("--------------------------------------------------------------------------------", &errs())); -// TheExtraFunctionPassManager->add(createLoopUnrollPass(INT_MAX,8)); - - TheMatrixStruct = StructType::create("Matrix", - Type::getInt8PtrTy(getGlobalContext()), // data - Type::getInt32Ty(getGlobalContext()), // channels - Type::getInt32Ty(getGlobalContext()), // columns - Type::getInt32Ty(getGlobalContext()), // rows - Type::getInt32Ty(getGlobalContext()), // frames - Type::getInt16Ty(getGlobalContext()), // hash - NULL); - QSharedPointer kernel(Transform::make("add(1)", NULL)); Template src, dst; @@ -1101,13 +1111,6 @@ class LLVMInitializer : public Initializer qDebug() << dst.m(); } - void finalize() const - { - delete TheFunctionPassManager; - delete TheExecutionEngine; - llvm_shutdown(); - } - static void benchmark(const QString &transform) { static Template src; @@ -1157,7 +1160,9 @@ likely_binary_function likely_make_binary_function(const char *description) return NULL; } -likely_unary_allocation likely_make_unary_allocation(const char *description, const likely_matrix *src) +extern "C" { + +LIKELY_EXPORT likely_unary_allocation likely_make_unary_allocation(const char *description, const likely_matrix *src) { if (description == NULL) qFatal("makeUnaryAllocation NULL description!"); const File f = long(description) < 1000 ? UnaryTransform::fileTable[long(description)] : File(description); @@ -1166,7 +1171,7 @@ likely_unary_allocation likely_make_unary_allocation(const char *description, co return unaryTransform->getAllocation(src); } -likely_binary_allocation likely_make_binary_allocation(const char *description, const likely_matrix *src_a, const likely_matrix *src_b) +LIKELY_EXPORT likely_binary_allocation likely_make_binary_allocation(const char *description, const likely_matrix *src_a, const likely_matrix *src_b) { (void) description; (void) src_a; @@ -1174,7 +1179,7 @@ likely_binary_allocation likely_make_binary_allocation(const char *description, return NULL; } -likely_unary_kernel likely_make_unary_kernel(const char *description, const likely_matrix *src) +LIKELY_EXPORT likely_unary_kernel likely_make_unary_kernel(const char *description, const likely_matrix *src) { if (description == NULL) qFatal("makeUnaryKernel NULL description!"); const File f = long(description) < 1000 ? UnaryTransform::fileTable[long(description)] : File(description); @@ -1183,7 +1188,7 @@ likely_unary_kernel likely_make_unary_kernel(const char *description, const like return unaryTransform->getKernel(src); } -likely_binary_kernel likely_make_binary_kernel(const char *description, const likely_matrix *src_a, const likely_matrix *src_b) +LIKELY_EXPORT likely_binary_kernel likely_make_binary_kernel(const char *description, const likely_matrix *src_a, const likely_matrix *src_b) { (void) description; (void) src_a; @@ -1191,4 +1196,6 @@ likely_binary_kernel likely_make_binary_kernel(const char *description, const li return NULL; } +} // extern "C" + #include "llvm.moc" diff --git a/share/openbr/doc b/share/openbr/doc index d446cb3..7236a15 160000 --- a/share/openbr/doc +++ b/share/openbr/doc @@ -1 +1 @@ -Subproject commit d446cb37c75632fb50af0c5c43bee55584b08107 +Subproject commit 7236a155867a161b9bf6c801e1d158250e36ebf3