Changeset 5861
- Timestamp:
- Feb 3, 2018, 12:02:14 PM (13 months ago)
- Location:
- icGREP/icgrep-devel/icgrep
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
icGREP/icgrep-devel/icgrep/IR_Gen/idisa_builder.h
r5832 r5861 16 16 namespace IDISA { 17 17 18 19 inline bool isStreamTy(llvm::Type * t) { 20 return t->isVectorTy() && (t->getVectorNumElements() == 0); 21 } 22 23 inline bool isStreamSetTy(llvm::Type * t) { 24 return t->isArrayTy() && (isStreamTy(t->getArrayElementType())); 25 } 26 27 inline unsigned getNumOfStreams (llvm::Type * t) { 28 if (isStreamTy(t)) return 1; 29 assert(isStreamSetTy(t)); 30 return t->getArrayNumElements(); 31 } 32 33 inline unsigned getStreamFieldWidth (llvm::Type * t) { 34 if (isStreamTy(t)) return t->getScalarSizeInBits(); 35 assert(isStreamSetTy(t)); 36 return t->getArrayElementType()->getScalarSizeInBits(); 37 } 38 39 18 40 class IDISA_Builder : public CBuilder { 19 41 … … 168 190 return getStreamSetTy(getContext(), NumElements, FieldWidth); 169 191 } 170 192 171 193 void CallPrintRegister(const std::string & regName, llvm::Value * const value); 172 194 -
icGREP/icgrep-devel/icgrep/grep_engine.cpp
r5860 r5861 49 49 using namespace llvm; 50 50 using namespace cc; 51 using namespace kernel; 51 52 52 53 static cl::opt<int> Threads("t", cl::desc("Total number of threads."), cl::init(2)); … … 116 117 117 118 #ifdef USE_DIRECT_LF_BUILDER 118 kernel::Kernel * linefeedK = mGrepDriver->addKernelInstance<kernel::LineFeedKernelBuilder>(idb, encodingBits);119 kernel::Kernel * linefeedK = mGrepDriver->addKernelInstance<kernel::LineFeedKernelBuilder>(idb, Binding{idb->getStreamSetTy(1, 8), "byteStream", FixedRate(), Principal()}); 119 120 mGrepDriver->makeKernelCall(linefeedK, {ByteStream}, {LineFeedStream}); 120 121 #endif … … 131 132 132 133 #ifndef USE_DIRECT_LF_BUILDER 133 kernel::Kernel * linefeedK = mGrepDriver->addKernelInstance<kernel::LineFeedKernelBuilder>(idb, encodingBits);134 kernel::Kernel * linefeedK = mGrepDriver->addKernelInstance<kernel::LineFeedKernelBuilder>(idb, Binding{idb->getStreamSetTy(8), "basis", FixedRate(), Principal()}); 134 135 mGrepDriver->makeKernelCall(linefeedK, {BasisBits}, {LineFeedStream}); 135 136 #endif -
icGREP/icgrep-devel/icgrep/kernels/charclasses.cpp
r5854 r5861 78 78 void CharClassesKernel::generatePabloMethod() { 79 79 PabloBuilder pb(getEntryScope()); 80 CC_Compiler *ccc;80 std::unique_ptr<CC_Compiler> ccc; 81 81 if (mUseDirectCC) { 82 ccc = new Direct_CC_Compiler(this, pb.createExtract(getInputStreamVar("byteData"), pb.getInteger(0))); 82 ccc = make_unique<cc::Direct_CC_Compiler>(this, pb.createExtract(getInput(0), pb.getInteger(0))); 83 } else { 84 ccc = make_unique<cc::Parabix_CC_Compiler>(this, getInputStreamSet("basis")); 83 85 } 84 else {85 ccc = new Parabix_CC_Compiler(this, getInputStreamSet("basis"));86 }87 88 86 unsigned n = mCCs.size(); 89 87 … … 96 94 } 97 95 98 UCD::UCDCompiler ucdCompiler(*ccc );96 UCD::UCDCompiler ucdCompiler(*ccc.get()); 99 97 if (LLVM_UNLIKELY(AlgorithmOptionIsSet(DisableIfHierarchy))) { 100 98 ucdCompiler.generateWithoutIfHierarchy(nameMap, pb); … … 114 112 } 115 113 } 116 delete ccc;117 114 } 118 115 -
icGREP/icgrep-devel/icgrep/kernels/linebreak_kernel.cpp
r5856 r5861 1 1 /* 2 * Copyright (c) 201 6International Characters.2 * Copyright (c) 2018 International Characters. 3 3 * This software is licensed to the public under the Open Software License 3.0. 4 4 */ … … 12 12 #include <cc/cc_compiler.h> 13 13 #include <pablo/builder.hpp> 14 #include <IR_Gen/idisa_builder.h> 14 15 #include <kernels/kernel_builder.h> 15 16 … … 21 22 using namespace re; 22 23 using namespace llvm; 24 using namespace IDISA; 23 25 24 LineFeedKernelBuilder::LineFeedKernelBuilder(const std::unique_ptr<kernel::KernelBuilder> & b, const unsigned codeUnitWidth)25 : PabloKernel(b, "lf" + std::to_string( codeUnitWidth),26 LineFeedKernelBuilder::LineFeedKernelBuilder(const std::unique_ptr<kernel::KernelBuilder> & b, Binding && inputStreamSet) 27 : PabloKernel(b, "lf" + std::to_string(getNumOfStreams(inputStreamSet.getType())) + "x" + std::to_string(getStreamFieldWidth(inputStreamSet.getType())), 26 28 // input 27 #ifdef USE_DIRECT_LF_BUILDER 28 {Binding{b->getStreamSetTy(1, codeUnitWidth), "byteStream", FixedRate(), Principal()}}, 29 #else 30 {Binding{b->getStreamSetTy(codeUnitWidth), "basis", FixedRate(), Principal()}}, 31 #endif 32 // output 33 {Binding{b->getStreamSetTy(1), "lf"}}) { 34 29 {inputStreamSet}, 30 {Binding{b->getStreamSetTy(1), "lf"}}), 31 mNumOfStreams(getNumOfStreams(inputStreamSet.getType())), 32 mStreamFieldWidth(getStreamFieldWidth(inputStreamSet.getType())) 33 { 35 34 } 36 35 37 36 void LineFeedKernelBuilder::generatePabloMethod() { 38 37 PabloBuilder pb(getEntryScope()); 39 #ifdef USE_DIRECT_LF_BUILDER 40 cc::Direct_CC_Compiler ccc(this, pb.createExtract(getInputStreamVar("byteStream"), pb.getInteger(0))); 41 #else 42 cc::Parabix_CC_Compiler ccc(this, getInputStreamSet("basis")); 43 #endif 44 PabloAST * LF = ccc.compileCC("LF", makeByte(0x0A), pb); 38 std::unique_ptr<CC_Compiler> ccc; 39 if (mNumOfStreams == 1) { 40 ccc = make_unique<cc::Direct_CC_Compiler>(this, pb.createExtract(getInput(0), pb.getInteger(0))); 41 } else { 42 ccc = make_unique<cc::Parabix_CC_Compiler>(this, getInputStreamSet("basis")); 43 } 44 PabloAST * LF = ccc->compileCC("LF", makeByte(0x0A), pb); 45 45 pb.createAssign(pb.createExtract(getOutput(0), 0), LF); 46 46 } -
icGREP/icgrep-devel/icgrep/kernels/linebreak_kernel.h
r5859 r5861 11 11 12 12 namespace kernel { 13 //#define USE_DIRECT_LF_BUILDER13 #define USE_DIRECT_LF_BUILDER 14 14 15 15 class LineFeedKernelBuilder final : public pablo::PabloKernel { 16 16 public: 17 LineFeedKernelBuilder(const std::unique_ptr<KernelBuilder> & b, unsigned codeUnitWidth = 8);17 LineFeedKernelBuilder(const std::unique_ptr<KernelBuilder> & b, kernel::Binding && inputStreamSet); 18 18 bool isCachable() const override { return true; } 19 19 bool hasSignature() const override { return false; } 20 20 protected: 21 21 void generatePabloMethod() override; 22 unsigned mNumOfStreams; 23 unsigned mStreamFieldWidth; 22 24 }; 23 25 -
icGREP/icgrep-devel/icgrep/toolchain/grep_pipeline.cpp
r5856 r5861 26 26 using namespace parabix; 27 27 using namespace llvm; 28 using namespace kernel; 28 29 29 30 namespace grep { … … 64 65 StreamSetBuffer * LineFeedStream = pxDriver.addBuffer<CircularBuffer>(idb, idb->getStreamSetTy(1, 1), segmentSize); 65 66 #ifdef USE_DIRECT_LF_BUILDER 66 kernel::Kernel * linefeedK = pxDriver.addKernelInstance<kernel::LineFeedKernelBuilder>(idb, 8);67 kernel::Kernel * linefeedK = pxDriver.addKernelInstance<kernel::LineFeedKernelBuilder>(idb, Binding{idb->getStreamSetTy(1, 8), "byteStream", FixedRate(), Principal()}); 67 68 pxDriver.makeKernelCall(linefeedK, {ByteStream}, {LineFeedStream}); 68 69 #endif … … 73 74 74 75 #ifndef USE_DIRECT_LF_BUILDER 75 kernel::Kernel * linefeedK = pxDriver.addKernelInstance<kernel::LineFeedKernelBuilder>(idb, 8);76 kernel::Kernel * linefeedK = pxDriver.addKernelInstance<kernel::LineFeedKernelBuilder>(idb, Binding{idb->getStreamSetTy(8), "basis", FixedRate(), Principal()}); 76 77 pxDriver.makeKernelCall(linefeedK, {BasisBits}, {LineFeedStream}); 77 78 #endif -
icGREP/icgrep-devel/icgrep/wc.cpp
r5847 r5861 42 42 CL_ENUM_VAL_SENTINEL), cl::cat(wcFlags), cl::Grouping); 43 43 44 44 static std::string wc_modes = ""; 45 45 46 46 static int defaultFieldWidth = 7; // default field width … … 83 83 class WordCountKernel final: public pablo::PabloKernel { 84 84 public: 85 WordCountKernel(const std::unique_ptr<kernel::KernelBuilder> & b );85 WordCountKernel(const std::unique_ptr<kernel::KernelBuilder> & b, Binding && inputStreamSet); 86 86 bool isCachable() const override { return true; } 87 87 bool hasSignature() const override { return false; } … … 90 90 }; 91 91 92 WordCountKernel::WordCountKernel (const std::unique_ptr<kernel::KernelBuilder> & b )93 : PabloKernel(b, "wc ",94 { Binding{b->getStreamSetTy(8, 1), "u8bit"}},92 WordCountKernel::WordCountKernel (const std::unique_ptr<kernel::KernelBuilder> & b, Binding && inputStreamSet) 93 : PabloKernel(b, "wc_" + wc_modes, 94 {inputStreamSet}, 95 95 {}, 96 96 {}, … … 101 101 void WordCountKernel::generatePabloMethod() { 102 102 PabloBuilder pb(getEntryScope()); 103 // input: 8 basis bit streams 104 std::vector<PabloAST *> u8_bits = getInputStreamSet("u8bit"); 103 std::unique_ptr<cc::CC_Compiler> ccc; 104 if (CountWords || CountChars) { 105 ccc = make_unique<cc::Parabix_CC_Compiler>(this, getInputStreamSet("u8bit")); 106 } else { 107 ccc = make_unique<cc::Direct_CC_Compiler>(this, pb.createExtract(getInput(0), pb.getInteger(0))); 108 } 109 105 110 // output: 3 counters 106 107 cc::Parabix_CC_Compiler ccc(this, u8_bits);108 109 111 Var * lc = getOutputScalarVar("lineCount"); 110 112 Var * wc = getOutputScalarVar("wordCount"); … … 112 114 113 115 if (CountLines) { 114 PabloAST * LF = ccc .compileCC(re::makeCC(0x0A));116 PabloAST * LF = ccc->compileCC(re::makeByte(0x0A)); 115 117 pb.createAssign(lc, pb.createCount(LF)); 116 118 } 117 119 if (CountWords) { 118 PabloAST * WS = ccc .compileCC(re::makeCC(re::makeCC(0x09, 0x0D), re::makeCC(0x20)));120 PabloAST * WS = ccc->compileCC(re::makeCC(re::makeByte(0x09, 0x0D), re::makeByte(0x20))); 119 121 PabloAST * wordChar = pb.createNot(WS); 120 122 // WS_follow_or_start = 1 past WS or at start of file … … 128 130 // not UTF-8, or is not valid? 129 131 // 130 PabloAST * u8Begin = ccc .compileCC(re::makeCC(re::makeCC(0, 0x7F), re::makeCC(0xC2, 0xF4)));132 PabloAST * u8Begin = ccc->compileCC(re::makeCC(re::makeByte(0, 0x7F), re::makeByte(0xC2, 0xF4))); 131 133 pb.createAssign(cc, pb.createCount(u8Begin)); 132 134 } … … 163 165 StreamSetBuffer * const ByteStream = pxDriver.addBuffer<SourceBuffer>(iBuilder, iBuilder->getStreamSetTy(1, 8)); 164 166 165 StreamSetBuffer * const BasisBits = pxDriver.addBuffer<CircularBuffer>(iBuilder, iBuilder->getStreamSetTy(8, 1), segmentSize * bufferSegments);166 167 167 168 Kernel * mmapK = pxDriver.addKernelInstance<MMapSourceKernel>(iBuilder); 168 169 mmapK->setInitialArguments({fileDecriptor}); 169 170 pxDriver.makeKernelCall(mmapK, {}, {ByteStream}); 170 171 Kernel * s2pk = pxDriver.addKernelInstance<S2PKernel>(iBuilder); 172 pxDriver.makeKernelCall(s2pk, {ByteStream}, {BasisBits}); 173 174 Kernel * wck = pxDriver.addKernelInstance<WordCountKernel>(iBuilder); 175 pxDriver.makeKernelCall(wck, {BasisBits}, {}); 171 172 Kernel * wck = nullptr; 173 if (CountWords || CountChars) { 174 StreamSetBuffer * const BasisBits = pxDriver.addBuffer<CircularBuffer>(iBuilder, iBuilder->getStreamSetTy(8, 1), segmentSize * bufferSegments); 175 Kernel * s2pk = pxDriver.addKernelInstance<S2PKernel>(iBuilder); 176 pxDriver.makeKernelCall(s2pk, {ByteStream}, {BasisBits}); 177 178 wck = pxDriver.addKernelInstance<WordCountKernel>(iBuilder, Binding{iBuilder->getStreamSetTy(8, 1), "u8bit"}); 179 pxDriver.makeKernelCall(wck, {BasisBits}, {}); 180 181 182 } else { 183 wck = pxDriver.addKernelInstance<WordCountKernel>(iBuilder, Binding{iBuilder->getStreamSetTy(1, 8), "u8byte"}); 184 pxDriver.makeKernelCall(wck, {ByteStream}, {}); 185 } 176 186 177 187 pxDriver.generatePipelineIR(); … … 217 227 case WordOption: CountWords = true; break; 218 228 case LineOption: CountLines = true; break; 219 case CharOption: Count Bytes = true; CountChars = false; break;220 case ByteOption: Count Chars = true; CountBytes = false; break;229 case CharOption: CountChars = true; CountBytes = false; break; 230 case ByteOption: CountBytes = true; CountChars = false; break; 221 231 } 222 232 } 223 233 } 224 234 if (CountLines) wc_modes += "l"; 235 if (CountWords) wc_modes += "w"; 236 if (CountChars) wc_modes += "m"; 237 if (CountBytes) wc_modes += "c"; 238 225 239 ParabixDriver pxDriver("wc"); 226 240 wcPipelineGen(pxDriver); … … 243 257 if (CountBytes) maxCount = TotalBytes; 244 258 259 260 245 261 int fieldWidth = std::to_string(maxCount).size() + 1; 246 262 if (fieldWidth < defaultFieldWidth) fieldWidth = defaultFieldWidth;
Note: See TracChangeset
for help on using the changeset viewer.