Commit 78254b65124d40642c7f6f4e4f437dcd4b0b9d78
1 parent
3ae7332d
substantial LLVM progress
Showing
2 changed files
with
65 additions
and
17 deletions
sdk/jitcv/jitcv.h
| @@ -3,9 +3,7 @@ | @@ -3,9 +3,7 @@ | ||
| 3 | 3 | ||
| 4 | #include <stddef.h> | 4 | #include <stddef.h> |
| 5 | #include <stdint.h> | 5 | #include <stdint.h> |
| 6 | - | ||
| 7 | -namespace jitcv | ||
| 8 | -{ | 6 | +#include <openbr.h> |
| 9 | 7 | ||
| 10 | /*! | 8 | /*! |
| 11 | * \brief jitcv matrix | 9 | * \brief jitcv matrix |
| @@ -83,16 +81,22 @@ struct Matrix | @@ -83,16 +81,22 @@ struct Matrix | ||
| 83 | inline uint32_t bytes() const { return bits() / 8 * elements(); } | 81 | inline uint32_t bytes() const { return bits() / 8 * elements(); } |
| 84 | }; | 82 | }; |
| 85 | 83 | ||
| 84 | +#ifdef __cplusplus | ||
| 85 | +extern "C" { | ||
| 86 | +#endif | ||
| 87 | + | ||
| 86 | typedef void (*UnaryFunction)(const Matrix *src, Matrix *dst); | 88 | typedef void (*UnaryFunction)(const Matrix *src, Matrix *dst); |
| 87 | typedef void (*BinaryFunction)(const Matrix *srcA, const Matrix *srcB, Matrix *dst); | 89 | typedef void (*BinaryFunction)(const Matrix *srcA, const Matrix *srcB, Matrix *dst); |
| 88 | -UnaryFunction makeUnaryFunction(const char *description); | ||
| 89 | -BinaryFunction makeBinaryFunction(const char *description); | 90 | +BR_EXPORT UnaryFunction makeUnaryFunction(const char *description); |
| 91 | +BR_EXPORT BinaryFunction makeBinaryFunction(const char *description); | ||
| 90 | 92 | ||
| 91 | typedef void (*UnaryKernel)(const Matrix *src, Matrix *dst, uint32_t size); | 93 | typedef void (*UnaryKernel)(const Matrix *src, Matrix *dst, uint32_t size); |
| 92 | typedef void (*BinaryKernel)(const Matrix *srcA, const Matrix *srcB, Matrix *dst, uint32_t size); | 94 | typedef void (*BinaryKernel)(const Matrix *srcA, const Matrix *srcB, Matrix *dst, uint32_t size); |
| 93 | -UnaryKernel makeUnaryKernel(const char *description, const Matrix *src); | ||
| 94 | -BinaryKernel makeBinaryKernel(const char *description, const Matrix *srcA, const Matrix *srcB); | 95 | +BR_EXPORT UnaryKernel makeUnaryKernel(const char *description, const Matrix *src); |
| 96 | +BR_EXPORT BinaryKernel makeBinaryKernel(const char *description, const Matrix *srcA, const Matrix *srcB); | ||
| 95 | 97 | ||
| 98 | +#ifdef __cplusplus | ||
| 96 | } | 99 | } |
| 100 | +#endif | ||
| 97 | 101 | ||
| 98 | #endif // __JITCV_H | 102 | #endif // __JITCV_H |
sdk/plugins/llvm.cpp
| @@ -25,7 +25,6 @@ | @@ -25,7 +25,6 @@ | ||
| 25 | 25 | ||
| 26 | using namespace br; | 26 | using namespace br; |
| 27 | using namespace cv; | 27 | using namespace cv; |
| 28 | -using namespace jitcv; | ||
| 29 | using namespace llvm; | 28 | using namespace llvm; |
| 30 | 29 | ||
| 31 | static Module *TheModule = NULL; | 30 | static Module *TheModule = NULL; |
| @@ -33,6 +32,8 @@ static ExecutionEngine *TheExecutionEngine = NULL; | @@ -33,6 +32,8 @@ static ExecutionEngine *TheExecutionEngine = NULL; | ||
| 33 | static FunctionPassManager *TheFunctionPassManager = NULL; | 32 | static FunctionPassManager *TheFunctionPassManager = NULL; |
| 34 | static FunctionPassManager *TheExtraFunctionPassManager = NULL; | 33 | static FunctionPassManager *TheExtraFunctionPassManager = NULL; |
| 35 | static StructType *TheMatrixStruct = NULL; | 34 | static StructType *TheMatrixStruct = NULL; |
| 35 | +static Function *makeUnaryKernelFunction = NULL; | ||
| 36 | +static Function *makeBinaryKernelFunction = NULL; | ||
| 36 | 37 | ||
| 37 | static QString MatrixToString(const Matrix &m) | 38 | static QString MatrixToString(const Matrix &m) |
| 38 | { | 39 | { |
| @@ -326,12 +327,21 @@ namespace br | @@ -326,12 +327,21 @@ namespace br | ||
| 326 | class UnaryTransform : public UntrainableMetaTransform | 327 | class UnaryTransform : public UntrainableMetaTransform |
| 327 | { | 328 | { |
| 328 | Q_OBJECT | 329 | Q_OBJECT |
| 329 | - | 330 | + uint32_t fileIndex; |
| 330 | UnaryKernel kernel; | 331 | UnaryKernel kernel; |
| 331 | - quint16 hash; | 332 | + uint16_t hash; |
| 332 | 333 | ||
| 333 | public: | 334 | public: |
| 334 | - UnaryTransform() : kernel(NULL), hash(0) {} | 335 | + static QHash<uint32_t, File> fileTable; |
| 336 | + | ||
| 337 | + UnaryTransform() : fileIndex(0), kernel(NULL), hash(0) {} | ||
| 338 | + | ||
| 339 | + void init() | ||
| 340 | + { | ||
| 341 | + fileIndex = fileTable.size()+1; | ||
| 342 | + fileTable.insert(fileIndex, file); | ||
| 343 | + } | ||
| 344 | + | ||
| 335 | virtual int preallocate(const Matrix &src, Matrix &dst) const = 0; /*!< Preallocate destintation matrix based on source matrix. */ | 345 | virtual int preallocate(const Matrix &src, Matrix &dst) const = 0; /*!< Preallocate destintation matrix based on source matrix. */ |
| 336 | virtual Value *buildPreallocate(const MatrixBuilder &src, const MatrixBuilder &dst) const { (void) src; (void) dst; return MatrixBuilder::constant(0); } | 346 | virtual Value *buildPreallocate(const MatrixBuilder &src, const MatrixBuilder &dst) const { (void) src; (void) dst; return MatrixBuilder::constant(0); } |
| 337 | virtual void build(const MatrixBuilder &src, const MatrixBuilder &dst, PHINode *i) const = 0; /*!< Build the kernel. */ | 347 | virtual void build(const MatrixBuilder &src, const MatrixBuilder &dst, PHINode *i) const = 0; /*!< Build the kernel. */ |
| @@ -375,9 +385,6 @@ private: | @@ -375,9 +385,6 @@ private: | ||
| 375 | 385 | ||
| 376 | Function *compile(const Matrix &m) const | 386 | Function *compile(const Matrix &m) const |
| 377 | { | 387 | { |
| 378 | - Function *kernel = compileKernel(m); | ||
| 379 | - optimize(kernel); | ||
| 380 | - | ||
| 381 | Constant *c = TheModule->getOrInsertFunction(qPrintable(mangledName()), | 388 | Constant *c = TheModule->getOrInsertFunction(qPrintable(mangledName()), |
| 382 | Type::getVoidTy(getGlobalContext()), | 389 | Type::getVoidTy(getGlobalContext()), |
| 383 | PointerType::getUnqual(TheMatrixStruct), | 390 | PointerType::getUnqual(TheMatrixStruct), |
| @@ -419,7 +426,10 @@ private: | @@ -419,7 +426,10 @@ private: | ||
| 419 | builder.CreateCondBr(hashTest, getKernel, preallocate); | 426 | builder.CreateCondBr(hashTest, getKernel, preallocate); |
| 420 | 427 | ||
| 421 | builder.SetInsertPoint(getKernel); | 428 | builder.SetInsertPoint(getKernel); |
| 422 | - builder.CreateStore(kernel, kernelFunction); | 429 | + builder.CreateStore(builder.CreateCall2(makeUnaryKernelFunction, |
| 430 | + builder.CreateIntToPtr(MatrixBuilder::constant(fileIndex, 32), Type::getInt8PtrTy(getGlobalContext())), | ||
| 431 | + src), | ||
| 432 | + kernelFunction); | ||
| 423 | builder.CreateStore(mb.hash(), kernelHash); | 433 | builder.CreateStore(mb.hash(), kernelHash); |
| 424 | builder.CreateBr(preallocate); | 434 | builder.CreateBr(preallocate); |
| 425 | builder.SetInsertPoint(preallocate); | 435 | builder.SetInsertPoint(preallocate); |
| @@ -486,6 +496,8 @@ private: | @@ -486,6 +496,8 @@ private: | ||
| 486 | } | 496 | } |
| 487 | }; | 497 | }; |
| 488 | 498 | ||
| 499 | +QHash<uint32_t, File> UnaryTransform::fileTable; | ||
| 500 | + | ||
| 489 | /*! | 501 | /*! |
| 490 | * \brief LLVM Binary Kernel | 502 | * \brief LLVM Binary Kernel |
| 491 | * \author Josh Klontz \cite jklontz | 503 | * \author Josh Klontz \cite jklontz |
| @@ -1017,6 +1029,34 @@ class LLVMInitializer : public Initializer | @@ -1017,6 +1029,34 @@ class LLVMInitializer : public Initializer | ||
| 1017 | Type::getInt16Ty(getGlobalContext()), // hash | 1029 | Type::getInt16Ty(getGlobalContext()), // hash |
| 1018 | NULL); | 1030 | NULL); |
| 1019 | 1031 | ||
| 1032 | + std::vector<Type*> unaryKernelParams; | ||
| 1033 | + unaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); | ||
| 1034 | + unaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); | ||
| 1035 | + unaryKernelParams.push_back(Type::getInt32Ty(getGlobalContext())); | ||
| 1036 | + Type *unaryKernelReturn = Type::getVoidTy(getGlobalContext()); | ||
| 1037 | + Type *unaryKernelType = PointerType::getUnqual(FunctionType::get(unaryKernelReturn, unaryKernelParams, false)); | ||
| 1038 | + std::vector<Type*> makeUnaryKernelParams; | ||
| 1039 | + makeUnaryKernelParams.push_back(Type::getInt8PtrTy(getGlobalContext())); | ||
| 1040 | + makeUnaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); | ||
| 1041 | + FunctionType* makeUnaryKernelType = FunctionType::get(unaryKernelType, makeUnaryKernelParams, false); | ||
| 1042 | + makeUnaryKernelFunction = Function::Create(makeUnaryKernelType, GlobalValue::ExternalLinkage, "makeUnaryKernel", TheModule); | ||
| 1043 | + makeUnaryKernelFunction->setCallingConv(CallingConv::C); | ||
| 1044 | + | ||
| 1045 | + std::vector<Type*> binaryKernelParams; | ||
| 1046 | + binaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); | ||
| 1047 | + binaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); | ||
| 1048 | + binaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); | ||
| 1049 | + binaryKernelParams.push_back(Type::getInt32Ty(getGlobalContext())); | ||
| 1050 | + Type *binaryKernelReturn = Type::getVoidTy(getGlobalContext()); | ||
| 1051 | + Type *binaryKernelType = PointerType::getUnqual(FunctionType::get(binaryKernelReturn, binaryKernelParams, false)); | ||
| 1052 | + std::vector<Type*> makeBinaryKernelParams; | ||
| 1053 | + makeBinaryKernelParams.push_back(Type::getInt8PtrTy(getGlobalContext())); | ||
| 1054 | + makeBinaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); | ||
| 1055 | + makeBinaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); | ||
| 1056 | + FunctionType* makeBinaryKernelType = FunctionType::get(binaryKernelType, makeBinaryKernelParams, false); | ||
| 1057 | + makeBinaryKernelFunction = Function::Create(makeBinaryKernelType, GlobalValue::ExternalLinkage, "makeBinaryKernel", TheModule); | ||
| 1058 | + makeBinaryKernelFunction->setCallingConv(CallingConv::C); | ||
| 1059 | + | ||
| 1020 | QSharedPointer<Transform> kernel(Transform::make("add(1)", NULL)); | 1060 | QSharedPointer<Transform> kernel(Transform::make("add(1)", NULL)); |
| 1021 | 1061 | ||
| 1022 | Template src, dst; | 1062 | Template src, dst; |
| @@ -1082,7 +1122,8 @@ BR_REGISTER(Initializer, LLVMInitializer) | @@ -1082,7 +1122,8 @@ BR_REGISTER(Initializer, LLVMInitializer) | ||
| 1082 | 1122 | ||
| 1083 | UnaryFunction makeUnaryFunction(const char *description) | 1123 | UnaryFunction makeUnaryFunction(const char *description) |
| 1084 | { | 1124 | { |
| 1085 | - QScopedPointer<UnaryTransform> unaryTransform(Factory<UnaryTransform>::make(description)); | 1125 | + QScopedPointer<UnaryTransform> unaryTransform(dynamic_cast<UnaryTransform*>(Transform::make(description, NULL))); |
| 1126 | + if (unaryTransform == NULL) qFatal("makeUnaryFunction NULL transform!"); | ||
| 1086 | return unaryTransform->getFunction(NULL); | 1127 | return unaryTransform->getFunction(NULL); |
| 1087 | } | 1128 | } |
| 1088 | 1129 | ||
| @@ -1094,7 +1135,10 @@ BinaryFunction makeBinaryFunction(const char *description) | @@ -1094,7 +1135,10 @@ BinaryFunction makeBinaryFunction(const char *description) | ||
| 1094 | 1135 | ||
| 1095 | UnaryKernel makeUnaryKernel(const char *description, const Matrix *src) | 1136 | UnaryKernel makeUnaryKernel(const char *description, const Matrix *src) |
| 1096 | { | 1137 | { |
| 1097 | - QScopedPointer<UnaryTransform> unaryTransform(Factory<UnaryTransform>::make(description)); | 1138 | + if (description == NULL) qFatal("makeUnaryKernel NULL description!"); |
| 1139 | + const File f = long(description) < 1000 ? UnaryTransform::fileTable[long(description)] : File(description); | ||
| 1140 | + QScopedPointer<UnaryTransform> unaryTransform(dynamic_cast<UnaryTransform*>(Transform::make(f, NULL))); | ||
| 1141 | + if (unaryTransform == NULL) qFatal("makeUnaryKernel NULL transform!"); | ||
| 1098 | return unaryTransform->getKernel(src); | 1142 | return unaryTransform->getKernel(src); |
| 1099 | } | 1143 | } |
| 1100 | 1144 |