source: icGREP/icgrep-devel/icgrep/editd/editd_gpu_kernel.cpp @ 6261

Last change on this file since 6261 was 6261, checked in by nmedfort, 7 months ago

Work on OptimizationBranch?; revisited pipeline termination

File size: 5.4 KB
Line 
1/*
2 *  Copyright (c) 2016 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 */
5#include "editd_gpu_kernel.h"
6#include <kernels/kernel_builder.h>
7#include <llvm/IR/Module.h>
8#include <iostream>
9using namespace llvm;
10
11namespace kernel {
12
13void bitblock_advance_ci_co(const std::unique_ptr<KernelBuilder> & iBuilder, Value * val, unsigned shift, Value * stideCarryArr, unsigned carryIdx, std::vector<std::vector<Value *>> & adv, std::vector<std::vector<int>> & calculated, int i, int j){
14    if (!calculated[i][j]) {
15        Value * ptr = iBuilder->CreateGEP(stideCarryArr, {iBuilder->getInt32(0), iBuilder->getInt32(carryIdx)});
16        Value * ci = iBuilder->CreateLoad(ptr);
17        std::pair<Value *, Value *> rslt = iBuilder->bitblock_advance(val, ci, shift);
18        iBuilder->CreateStore(std::get<0>(rslt), ptr);
19        adv[i][j] = std::get<1>(rslt);
20        calculated[i][j] = 1;
21    }
22}
23
24void reset_to_zero(std::vector<std::vector<int>> & calculated){
25    for (auto & sub : calculated) {
26        std::fill(sub.begin(), sub.end(), 0);
27    }
28}
29
30void editdGPUKernel::generateDoBlockMethod(const std::unique_ptr<KernelBuilder> & idb) {
31
32    IntegerType * const int32ty = idb->getInt32Ty();
33    IntegerType * const int8ty = idb->getInt8Ty();
34    Value * groupLen = idb->getInt32((mPatternLen + 1) * mGroupSize);
35    Value * pattPos = idb->getInt32(0);
36    Value * pattBuf = idb->getScalarField("pattStream");
37    Value * strideCarryArr = idb->getScalarField("strideCarry");
38
39    unsigned carryIdx = 0;
40
41    std::vector<std::vector<Value *>> e(mPatternLen + 1, std::vector<Value *>(mEditDistance + 1));
42    std::vector<std::vector<Value *>> adv(mPatternLen, std::vector<Value *>(mEditDistance + 1));
43    std::vector<std::vector<int>> calculated(mPatternLen, std::vector<int>(mEditDistance + 1, 0));
44
45    Module * m = idb->getModule();
46    Function * bidFunc = cast<Function>(m->getOrInsertFunction("llvm.nvvm.read.ptx.sreg.ctaid.x", int32ty, nullptr));
47    Value * bid = idb->CreateCall(bidFunc);
48    Value * pattStartPtr = idb->CreateGEP(pattBuf, idb->CreateMul(groupLen, bid));
49
50    for(unsigned j = 0; j <= mEditDistance; j++){
51        e[mPatternLen][j] = idb->allZeroes();
52    }
53
54    for(unsigned j = 1; j <= mEditDistance; j++){
55        e[0][j] = idb->allOnes();
56    }
57
58    for(unsigned g = 0; g < mGroupSize; g++){
59        Value * pattCh = idb->CreateLoad(idb->CreateGEP(pattStartPtr, pattPos));
60        Value * pattIdx = idb->CreateAnd(idb->CreateLShr(pattCh, 1), ConstantInt::get(int8ty, 3));
61        Value * pattStream = idb->loadInputStreamBlock("CCStream", idb->CreateZExt(pattIdx, int32ty));
62        pattPos = idb->CreateAdd(pattPos, ConstantInt::get(int32ty, 1));
63        e[0][0] = pattStream;
64        for(unsigned i = 1; i < mPatternLen; i++){
65            Value * pattCh = idb->CreateLoad(idb->CreateGEP(pattStartPtr, pattPos));
66            pattIdx = idb->CreateAnd(idb->CreateLShr(pattCh, 1), ConstantInt::get(int8ty, 3));
67            pattStream = idb->loadInputStreamBlock("CCStream", idb->CreateZExt(pattIdx, int32ty));
68            pattPos = idb->CreateAdd(pattPos, ConstantInt::get(int32ty, 1));
69            bitblock_advance_ci_co(idb, e[i-1][0], 1, strideCarryArr, carryIdx++, adv, calculated, i-1, 0);
70            e[i][0] = idb->CreateAnd(adv[i-1][0], pattStream);
71            for(unsigned j = 1; j<= mEditDistance; j++){
72                bitblock_advance_ci_co(idb, e[i-1][j], 1, strideCarryArr, carryIdx++, adv, calculated, i-1, j);
73                bitblock_advance_ci_co(idb, e[i-1][j-1], 1, strideCarryArr, carryIdx++, adv, calculated, i-1, j-1);
74                bitblock_advance_ci_co(idb, e[i][j-1], 1, strideCarryArr, carryIdx++, adv, calculated, i, j-1);
75                Value * tmp1 = idb->CreateAnd(adv[i-1][j], pattStream);
76                Value * tmp2 = idb->CreateAnd(adv[i-1][j-1], idb->CreateNot(pattStream));
77                Value * tmp3 = idb->CreateOr(adv[i][j-1], e[i-1][j-1]);
78                e[i][j] = idb->CreateOr(idb->CreateOr(tmp1, tmp2), tmp3);
79            }
80        }
81        e[mPatternLen][0] = idb->CreateOr(e[mPatternLen][0], e[mPatternLen-1][0]);
82        for(unsigned j = 1; j<= mEditDistance; j++){
83            e[mPatternLen][j] = idb->CreateOr(e[mPatternLen][j], idb->CreateAnd(e[mPatternLen - 1][j], idb->CreateNot(e[mPatternLen - 1][j - 1])));
84        }
85        pattPos = idb->CreateAdd(pattPos, ConstantInt::get(int32ty, 1));
86        reset_to_zero(calculated);
87    }
88
89    for(unsigned j = 0; j<= mEditDistance; j++){
90        idb->storeOutputStreamBlock("ResultStream", idb->getInt32(j), e[mPatternLen][j]);
91    }
92}
93
94void editdGPUKernel::generateFinalBlockMethod(const std::unique_ptr<KernelBuilder> & idb, Value * remainingBytes) {
95    idb->setScalarField("EOFmask", idb->bitblock_mask_from(remainingBytes));
96    CreateDoBlockMethodCall(idb);
97}
98
99editdGPUKernel::editdGPUKernel(const std::unique_ptr<kernel::KernelBuilder> & b, unsigned dist, unsigned pattLen, unsigned groupSize) :
100BlockOrientedKernel(b, "editd_gpu",
101              {Binding{b->getStreamSetTy(4), "CCStream"}},
102              {Binding{b->getStreamSetTy(dist + 1), "ResultStream"}},
103              {Binding{PointerType::get(b->getInt8Ty(), 1), "pattStream"},
104              Binding{PointerType::get(ArrayType::get(b->getBitBlockType(), pattLen * (dist + 1) * 4 * groupSize), 0), "strideCarry"}},
105              {},
106              {Binding{b->getBitBlockType(), "EOFmask"}})
107, mEditDistance(dist)
108, mPatternLen(pattLen)
109, mGroupSize(groupSize) {
110}
111
112}
113
114
Note: See TracBrowser for help on using the repository browser.