Changeset 5618
- Timestamp:
- Aug 25, 2017, 11:20:16 PM (18 months ago)
- Location:
- icGREP/icgrep-devel/icgrep
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
icGREP/icgrep-devel/icgrep/kernels/streamset.cpp
r5615 r5618 140 140 } 141 141 142 Value * StreamSetBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition ) const {142 Value * StreamSetBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition, bool reverse) const { 143 143 if (isa<ArrayType>(mType) && dyn_cast<ArrayType>(mType)->getNumElements() > 1) { 144 144 Constant * stride = iBuilder->getSize(iBuilder->getStride()); 145 return iBuilder->CreateSub(stride, iBuilder->CreateURem(fromPosition, stride)); 145 Value * strideRem = iBuilder->CreateURem(fromPosition, stride); 146 if (reverse) { 147 return iBuilder->CreateSelect(iBuilder->CreateICmpEQ(strideRem, iBuilder->getSize(0)), stride, strideRem); 148 } 149 else return iBuilder->CreateSub(stride, strideRem); 146 150 } else { 147 151 Constant * bufSize = iBuilder->getSize(mBufferBlocks * iBuilder->getStride()); 148 return iBuilder->CreateSub(bufSize, iBuilder->CreateURem(fromPosition, bufSize, "linearItems")); 149 } 150 } 151 152 Value * StreamSetBuffer::getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock) const { 152 Value * bufRem = iBuilder->CreateURem(fromPosition, bufSize); 153 if (reverse) { 154 return iBuilder->CreateSelect(iBuilder->CreateICmpEQ(bufRem, iBuilder->getSize(0)), bufSize, bufRem); 155 } 156 else return iBuilder->CreateSub(bufSize, bufRem, "linearItems"); 157 } 158 } 159 160 Value * StreamSetBuffer::getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock, bool reverse) const { 153 161 Constant * bufBlocks = iBuilder->getSize(mBufferBlocks); 154 return iBuilder->CreateSub(bufBlocks, iBuilder->CreateURem(fromBlock, bufBlocks), "linearBlocks"); 155 } 156 157 Value * StreamSetBuffer::getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition) const { 158 return getLinearlyAccessibleItems(iBuilder, self, fromPosition); 159 } 160 161 Value * StreamSetBuffer::getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock) const { 162 return getLinearlyAccessibleBlocks(iBuilder, self, fromBlock); 162 Value * bufRem = iBuilder->CreateURem(fromBlock, bufBlocks); 163 if (reverse) { 164 return iBuilder->CreateSelect(iBuilder->CreateICmpEQ(bufRem, iBuilder->getSize(0)), bufBlocks, bufRem); 165 } 166 else return iBuilder->CreateSub(bufBlocks, bufRem, "linearBlocks"); 167 } 168 169 Value * StreamSetBuffer::getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition, bool reverse) const { 170 return getLinearlyAccessibleItems(iBuilder, self, fromPosition, reverse); 171 } 172 173 Value * StreamSetBuffer::getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock, bool reverse) const { 174 return getLinearlyAccessibleBlocks(iBuilder, self, fromBlock, reverse); 163 175 } 164 176 … … 257 269 } 258 270 259 Value * SourceBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition) const { 271 Value * SourceBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition, bool reverse) const { 272 if (reverse) report_fatal_error("SourceBuffer cannot be accessed in reverse"); 260 273 return iBuilder->CreateSub(getCapacity(iBuilder, self), fromPosition); 261 274 } 262 275 263 Value * SourceBuffer::getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock) const { 276 Value * SourceBuffer::getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock, bool reverse) const { 277 if (reverse) report_fatal_error("SourceBuffer cannot be accessed in reverse"); 264 278 return iBuilder->CreateSub(iBuilder->CreateUDiv(getCapacity(iBuilder, self), iBuilder->getSize(iBuilder->getBitBlockWidth())), fromBlock); 265 279 } … … 292 306 } 293 307 294 Value * ExternalBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const, Value *, Value * ) const {308 Value * ExternalBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const, Value *, Value *, bool reverse) const { 295 309 report_fatal_error("External buffers: getLinearlyAccessibleItems is not supported."); 296 310 } … … 328 342 } 329 343 330 Value * CircularCopybackBuffer::getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition) const { 331 return iBuilder->CreateAdd(getLinearlyAccessibleItems(iBuilder, self, fromPosition), iBuilder->getSize(mOverflowBlocks * iBuilder->getBitBlockWidth())); 332 } 333 334 Value * CircularCopybackBuffer::getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock) const { 335 return iBuilder->CreateAdd(getLinearlyAccessibleBlocks(iBuilder, self, fromBlock), iBuilder->getSize(mOverflowBlocks)); 344 Value * CircularCopybackBuffer::getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition, bool reverse) const { 345 Value * accessibleItems = getLinearlyAccessibleItems(iBuilder, self, fromPosition, reverse); 346 if (reverse) return accessibleItems; 347 return iBuilder->CreateAdd(accessibleItems, iBuilder->getSize(mOverflowBlocks * iBuilder->getBitBlockWidth())); 348 } 349 350 Value * CircularCopybackBuffer::getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock, bool reverse) const { 351 Value * accessibleBlocks = getLinearlyAccessibleBlocks(iBuilder, self, fromBlock); 352 if (reverse) return accessibleBlocks; 353 return iBuilder->CreateAdd(accessibleBlocks, iBuilder->getSize(mOverflowBlocks)); 336 354 } 337 355 … … 392 410 } 393 411 394 Value * SwizzledCopybackBuffer::getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition) const { 395 return iBuilder->CreateAdd(getLinearlyAccessibleItems(iBuilder, self, fromPosition), iBuilder->getSize(mOverflowBlocks * iBuilder->getBitBlockWidth())); 396 } 397 398 Value * SwizzledCopybackBuffer::getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock) const { 399 return iBuilder->CreateAdd(getLinearlyAccessibleBlocks(iBuilder, self, fromBlock), iBuilder->getSize(mOverflowBlocks)); 412 Value * SwizzledCopybackBuffer::getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromPosition, bool reverse) const { 413 Value * accessibleItems = getLinearlyAccessibleItems(iBuilder, self, fromPosition, reverse); 414 if (reverse) return accessibleItems; 415 return iBuilder->CreateAdd(accessibleItems, iBuilder->getSize(mOverflowBlocks * iBuilder->getBitBlockWidth())); 416 } 417 418 Value * SwizzledCopybackBuffer::getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * fromBlock, bool reverse) const { 419 Value * accessibleBlocks = getLinearlyAccessibleBlocks(iBuilder, self, fromBlock); 420 if (reverse) return accessibleBlocks; 421 return iBuilder->CreateAdd(accessibleBlocks, iBuilder->getSize(mOverflowBlocks)); 400 422 } 401 423 … … 554 576 } 555 577 556 Value * ExpandableBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value * ) const {578 Value * ExpandableBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, Value * self, Value *, bool reverse) const { 557 579 report_fatal_error("Expandable buffers: getLinearlyAccessibleItems is not supported."); 558 580 } … … 639 661 640 662 641 Value * DynamicBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const b, Value * handle, Value * fromPosition ) const {663 Value * DynamicBuffer::getLinearlyAccessibleItems(IDISA::IDISA_Builder * const b, Value * handle, Value * fromPosition, bool reverse) const { 642 664 Constant * blockSize = b->getSize(b->getBitBlockWidth()); 643 665 if (isa<ArrayType>(mType) && dyn_cast<ArrayType>(mType)->getNumElements() > 1) { 644 return b->CreateSub(blockSize, b->CreateURem(fromPosition, blockSize)); 666 Value * blockRem = b->CreateURem(fromPosition, blockSize); 667 if (reverse) { 668 return b->CreateSelect(b->CreateICmpEQ(blockRem, b->getSize(0)), blockSize, blockRem); 669 } 670 else return b->CreateSub(blockSize, blockRem); 645 671 } else { 646 672 Value * const bufBlocks = b->CreateLoad(b->CreateGEP(handle, {b->getInt32(0), b->getInt32(int(Field::WorkingBlocks))})); 647 673 Value * bufSize = b->CreateMul(bufBlocks, blockSize); 648 return b->CreateSub(bufSize, b->CreateURem(fromPosition, bufSize, "linearItems")); 649 } 650 } 651 652 Value * DynamicBuffer::getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const b, Value * handle, Value * fromBlock) const { 674 Value * bufRem = b->CreateURem(fromPosition, bufSize); 675 if (reverse) { 676 return b->CreateSelect(b->CreateICmpEQ(bufRem, b->getSize(0)), bufSize, bufRem); 677 } 678 else return b->CreateSub(bufSize, bufRem, "linearItems"); 679 } 680 } 681 682 Value * DynamicBuffer::getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const b, Value * handle, Value * fromBlock, bool reverse) const { 653 683 Value * const bufBlocks = b->CreateLoad(b->CreateGEP(handle, {b->getInt32(0), b->getInt32(int(Field::WorkingBlocks))})); 654 return b->CreateSub(bufBlocks, b->CreateURem(fromBlock, bufBlocks), "linearBlocks"); 684 Value * bufRem = b->CreateURem(fromBlock, bufBlocks); 685 if (reverse) { 686 return b->CreateSelect(b->CreateICmpEQ(bufRem, b->getSize(0)), bufBlocks, bufRem); 687 } 688 else return b->CreateSub(bufBlocks, bufRem, "linearBlocks"); 655 689 } 656 690 … … 674 708 Type * bufPtrType = bufBasePtrField->getType()->getPointerElementType(); 675 709 Value * bufPtr = b->CreatePointerCast(b->CreateCacheAlignedMalloc(bufSize), bufPtrType); 710 if (codegen::DebugOptionIsSet(codegen::TraceDynamicBuffers)) { 711 b->CallPrintInt("allocated: ", bufPtr); 712 b->CallPrintInt("allocated capacity: ", bufSize); 713 } 676 714 b->CreateStore(bufPtr, bufBasePtrField); 677 715 b->CreateStore(ConstantPointerNull::getNullValue(bufPtrType), b->CreateGEP(handle, {b->getInt32(0), b->getInt32(int(DynamicBuffer::Field::PriorBaseAddress))})); … … 696 734 b->CreateCondBr(priorBufIsNonNull, freePrior, freeCurrent); 697 735 b->SetInsertPoint(freePrior); 698 //b->CallPrintInt("releasing: ", priorBuf); 736 if (codegen::DebugOptionIsSet(codegen::TraceDynamicBuffers)) { 737 b->CallPrintInt("releasing: ", priorBuf); 738 } 699 739 b->CreateFree(priorBuf); 700 740 b->CreateBr(freeCurrent); … … 722 762 723 763 Value * oldBufPtr = b->CreateLoad(bufBasePtrField); 724 Value * const currentWorkingBlocks = b->CreateLoad(workingBlocksField); 725 //b->CallPrintInt("currentWorkingBlocks: ", currentWorkingBlocks); 764 Value * currentWorkingBlocks = b->CreateLoad(workingBlocksField); 726 765 Value * workingBytes = b->CreateMul(currentWorkingBlocks, blockBytes); 727 766 Value * const curAllocated = b->CreateLoad(capacityField); … … 744 783 b->CreateCondBr(priorBufIsNonNull, deallocatePrior, allocateNew); 745 784 b->SetInsertPoint(deallocatePrior); 746 //b->CallPrintInt("deallocating: ", priorBuf); 785 if (codegen::DebugOptionIsSet(codegen::TraceDynamicBuffers)) { 786 b->CallPrintInt("deallocating: ", priorBuf); 787 } 747 788 b->CreateFree(priorBuf); 748 789 b->CreateBr(allocateNew); … … 750 791 b->CreateStore(oldBufPtr, priorBasePtrField); 751 792 Value * newBufPtr = b->CreatePointerCast(b->CreateCacheAlignedMalloc(neededCapacity), bufPtrType); 752 //b->CallPrintInt("allocated: ", newBufPtr); 753 //b->CallPrintInt("allocated capacity: ", neededCapacity); 754 793 if (codegen::DebugOptionIsSet(codegen::TraceDynamicBuffers)) { 794 b->CallPrintInt("re-allocated: ", newBufPtr); 795 b->CallPrintInt("allocated capacity: ", neededCapacity); 796 } 755 797 b->CreateStore(newBufPtr, bufBasePtrField); 756 798 createBlockCopy(b, newBufPtr, oldBufPtr, currentWorkingBlocks); … … 762 804 bufPtr->addIncoming(newBufPtr, allocateNew); 763 805 createBlockCopy(b, b->CreateGEP(bufPtr, currentWorkingBlocks), bufPtr, currentWorkingBlocks); 764 b->CreateStore(b->CreateAdd(currentWorkingBlocks, currentWorkingBlocks), workingBlocksField); 806 currentWorkingBlocks = b->CreateAdd(currentWorkingBlocks, currentWorkingBlocks); 807 if (codegen::DebugOptionIsSet(codegen::TraceDynamicBuffers)) { 808 b->CallPrintInt("currentWorkingBlocks: ", currentWorkingBlocks); 809 } 810 b->CreateStore(currentWorkingBlocks, workingBlocksField); 765 811 } 766 812 -
icGREP/icgrep-devel/icgrep/kernels/streamset.h
r5612 r5618 83 83 84 84 // The number of items that cam be linearly accessed from a given logical stream position. 85 virtual llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition ) const;86 87 virtual llvm::Value * getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock ) const;85 virtual llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition, bool reverse = false) const; 86 87 virtual llvm::Value * getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock, bool reverse = false) const; 88 88 89 89 void createBlockCopy(IDISA::IDISA_Builder * const iBuilder, llvm::Value * targetBlockPtr, llvm::Value * sourceBlockPtr, llvm::Value * blocksToCopy) const; … … 91 91 virtual void createBlockAlignedCopy(IDISA::IDISA_Builder * const iBuilder, llvm::Value * targetBlockPtr, llvm::Value * sourceBlockPtr, llvm::Value * itemsToCopy) const; 92 92 93 virtual llvm::Value * getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition ) const;94 95 virtual llvm::Value * getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock ) const;93 virtual llvm::Value * getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition, bool reverse = false) const; 94 95 virtual llvm::Value * getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock, bool reverse = false) const; 96 96 97 97 virtual ~StreamSetBuffer() = 0; … … 158 158 llvm::Value * getCapacity(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self) const override; 159 159 160 llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition ) const override;161 162 llvm::Value * getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock ) const override;160 llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition, bool reverse = false) const override; 161 162 llvm::Value * getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock, bool reverse = false) const override; 163 163 164 164 llvm::Type * getStreamSetBlockType() const override; … … 186 186 ExternalBuffer(const std::unique_ptr<kernel::KernelBuilder> & b, llvm::Type * type, llvm::Value * addr, unsigned AddressSpace = 0); 187 187 188 llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition ) const override;188 llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition, bool reverse = false) const override; 189 189 190 190 void allocateBuffer(const std::unique_ptr<kernel::KernelBuilder> & iBuilder) override; … … 230 230 void createCopyBack(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * overflowItems) const; 231 231 232 llvm::Value * getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition ) const override;233 234 llvm::Value * getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock ) const override;232 llvm::Value * getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition, bool reverse = false) const override; 233 234 llvm::Value * getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock, bool reverse = false) const override; 235 235 236 236 void allocateBuffer(const std::unique_ptr<kernel::KernelBuilder> & iBuilder) override; … … 252 252 void createCopyBack(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * overflowItems) const; 253 253 254 llvm::Value * getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition ) const override;255 256 llvm::Value * getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock ) const override;254 llvm::Value * getLinearlyWritableItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition, bool reverse = false) const override; 255 256 llvm::Value * getLinearlyWritableBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock, bool reverse = false) const override; 257 257 258 258 void allocateBuffer(const std::unique_ptr<kernel::KernelBuilder> & iBuilder) override; … … 279 279 llvm::Value * getStreamPackPtr(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * streamIndex, llvm::Value * blockIndex, llvm::Value * packIndex, const bool readOnly) const override; 280 280 281 llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition ) const override;281 llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromPosition, bool reverse = false) const override; 282 282 283 283 llvm::Value * getStreamSetCount(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self) const override; … … 310 310 DynamicBuffer(const std::unique_ptr<kernel::KernelBuilder> & b, llvm::Type * type, size_t initialCapacity, size_t overflowBlocks = 0, unsigned swizzleFactor = 1, unsigned addrSpace = 0); 311 311 312 llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const b, llvm::Value * handle, llvm::Value * fromPosition ) const override;313 314 llvm::Value * getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock ) const override;312 llvm::Value * getLinearlyAccessibleItems(IDISA::IDISA_Builder * const b, llvm::Value * handle, llvm::Value * fromPosition, bool reverse = false) const override; 313 314 llvm::Value * getLinearlyAccessibleBlocks(IDISA::IDISA_Builder * const iBuilder, llvm::Value * self, llvm::Value * fromBlock, bool reverse = false) const override; 315 315 316 316 void allocateBuffer(const std::unique_ptr<kernel::KernelBuilder> & b) override; -
icGREP/icgrep-devel/icgrep/toolchain/toolchain.cpp
r5616 r5618 29 29 #endif 30 30 clEnumVal(SerializeThreads, "Force segment threads to run sequentially."), 31 clEnumVal(TraceDynamicBuffers, "Show dynamic buffer allocations and deallocations."), 31 32 clEnumValEnd), cl::cat(CodeGenOptions)); 32 33 -
icGREP/icgrep-devel/icgrep/toolchain/toolchain.h
r5486 r5618 31 31 ShowASM, 32 32 #endif 33 SerializeThreads 33 SerializeThreads, 34 TraceDynamicBuffers 34 35 }; 35 36
Note: See TracChangeset
for help on using the changeset viewer.