Sreejita saha via llvm-dev
2017-Jun-05 20:45 UTC
[llvm-dev] Backend implementation for an architecture with only majority operation instruction
Hey Sean, So the processor does in-memory computing, it reads instructions and operands from the memory array, performs the majority operations within the memory array itself. It does instructions using resistive majority which is AB'+B'C+AC Like it does AND operation as 1: 0, 1, @C; //C=0 2: 0, 1, @Binv; //Binv=0 3: 1, @B, @Binv; //Binv=B 4: @A, @Binv, @C; //C=A.B where each operation is a resistive majority and operations are directly performed on the storage of C. It reads @A in a register , @B , reads A and B and directly writes into the memory @C. There are shift operators as well that are also performed in a similar way, loads, stores are also performed like this. So I am trying to define this resistive majority instruction in my ISA. Thanks! -Sreejita On Sun, Jun 4, 2017 at 8:22 PM, Sean Silva <chisophugis at gmail.com> wrote:> I'm having a hard time grasping what this ISA actually looks like. > > When you say that it has a single instruction that is a majority function, > I assume something like this: > > MAJ rDst <- rSrc0, rSrc1, rSrc2 > Semantics: > for (int i = 0; i < REGISTER_WIDTH; i++) { > rDst[i] = maj(rSrc0[i], rSrc1[i], rSrc2[i]); > } > Where maj(a, b, c) = (a & b) | (a & c) | (b & c) > > But that doesn't make sense given your question. > > MAJ is a bitwise operation, so how do you implement arithmetic > instructions with it? You would need at least one other instruction (such > as a bit shift) to establish dependency chains between bits. > > Also, how do you decompose load/store into majority functions? It's not > even clear to me what that would actually mean. You need to access the > memory/IO bus somehow, and if your only instruction only reads/writes to > registers, the only way to do that would be to have special registers that > interface to the IO bus? > > -- Sean Silva > > On Thu, Jun 1, 2017 at 8:13 PM, Sreejita saha via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> Hello everyone, >> >> >> >> I was trying to create an LLVM backend for a processor with a very simple >> architecture and that does all instructions like load, store, arithmetic >> and logical instructions using a bunch of majority functions. The processor >> has only one instruction(majority function) in its ISA and breaks down all >> other instructions into a number of majority instructions depending on what >> instruction it is. All the instructions have different combinations of >> majority operations. Is there any way to implement this without creating a >> new Selection DAG node for the majority operation? >> >> I was thinking of creation of a new Selection DAG node and mapping all >> the other instructions like loads, stores as pseudo instructions and >> breaking them up. Can someone please help me with this? >> >> >> >> Thanks! >> >> Sreejita >> >> >> >> >> >> Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for >> Windows 10 >> >> >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170605/5433f9c9/attachment.html>
Sean Silva via llvm-dev
2017-Jun-06 00:26 UTC
[llvm-dev] Backend implementation for an architecture with only majority operation instruction
On Mon, Jun 5, 2017 at 1:45 PM, Sreejita saha <sreejitasaha2011 at gmail.com> wrote:> Hey Sean, > So the processor does in-memory computing, it reads instructions and > operands from the memory array, performs the majority operations within the > memory array itself. > It does instructions using resistive majority which is AB'+B'C+AC > Like it does AND operation as > 1: 0, 1, @C; //C=0 > 2: 0, 1, @Binv; //Binv=0 > 3: 1, @B, @Binv; //Binv=B > 4: @A, @Binv, @C; //C=A.B > where each operation is a resistive majority and operations are directly > performed on the storage of C. It reads @A in a register , @B , reads A > and B and directly writes into the memory @C. There are shift operators as > well that are also performed in a similar way, loads, stores are also > performed like this. >Can you show an example of the load/store and add/shift? For example, how does your ISA represent this function? void add(int *dst, int *src0, int *src1) { *dst = *src0 + *src1; } -- Sean Silva> So I am trying to define this resistive majority instruction in my ISA. > > Thanks! > -Sreejita > > > On Sun, Jun 4, 2017 at 8:22 PM, Sean Silva <chisophugis at gmail.com> wrote: > >> I'm having a hard time grasping what this ISA actually looks like. >> >> When you say that it has a single instruction that is a majority >> function, I assume something like this: >> >> MAJ rDst <- rSrc0, rSrc1, rSrc2 >> Semantics: >> for (int i = 0; i < REGISTER_WIDTH; i++) { >> rDst[i] = maj(rSrc0[i], rSrc1[i], rSrc2[i]); >> } >> Where maj(a, b, c) = (a & b) | (a & c) | (b & c) >> >> But that doesn't make sense given your question. >> >> MAJ is a bitwise operation, so how do you implement arithmetic >> instructions with it? You would need at least one other instruction (such >> as a bit shift) to establish dependency chains between bits. >> >> Also, how do you decompose load/store into majority functions? It's not >> even clear to me what that would actually mean. You need to access the >> memory/IO bus somehow, and if your only instruction only reads/writes to >> registers, the only way to do that would be to have special registers that >> interface to the IO bus? >> >> -- Sean Silva >> >> On Thu, Jun 1, 2017 at 8:13 PM, Sreejita saha via llvm-dev < >> llvm-dev at lists.llvm.org> wrote: >> >>> Hello everyone, >>> >>> >>> >>> I was trying to create an LLVM backend for a processor with a very >>> simple architecture and that does all instructions like load, store, >>> arithmetic and logical instructions using a bunch of majority functions. >>> The processor has only one instruction(majority function) in its ISA and >>> breaks down all other instructions into a number of majority instructions >>> depending on what instruction it is. All the instructions have different >>> combinations of majority operations. Is there any way to implement this >>> without creating a new Selection DAG node for the majority operation? >>> >>> I was thinking of creation of a new Selection DAG node and mapping all >>> the other instructions like loads, stores as pseudo instructions and >>> breaking them up. Can someone please help me with this? >>> >>> >>> >>> Thanks! >>> >>> Sreejita >>> >>> >>> >>> >>> >>> Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for >>> Windows 10 >>> >>> >>> >>> _______________________________________________ >>> LLVM Developers mailing list >>> llvm-dev at lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>> >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170605/7960247d/attachment-0001.html>
Sreejita saha via llvm-dev
2017-Jun-06 20:53 UTC
[llvm-dev] Backend implementation for an architecture with only majority operation instruction
Hey, So for doing such pointer arithmetic it doesn't load the values as the controller has no execution unit as such it does al computation in the memory itself. So for such a function it would do just an add which looks like this : ADD @A, @BXOR @A, at B, at T; / / T = A xor B AND @A, at B, at R; / / R = A · B iRM 3w 0 , 1 , at CI ; / / CI = 0 iRM 3w 0 , 1 , at U; / / U = 0 iRM 3w 0 , 1 , at V; / / V = 0 iRM 3w 1 , at T, at U; / / U = T iRM 3 @CI+0 , at U+0 , at V+ 1 ; / / V=[0, (c 0 · t 0 ), . . . , 0] iRM 3 @R+ 0 , 0 , CI + 1 ; / / CI=[0, r 0 , . . . , 0] iRM 3 @V+1,0, at CI+1; // CI=[0, (r 0 + (c 0 · t 0 )), . . . ] .. . iRM 3 @CI+62 @U+62 @V+ 6 3 ; iRM 3 @R+ 6 2 , 0 , at CI ; iRM 3 @V+ 6 3 , 0 , at CI+ 6 3 ; XOR @T, @CI , at A; / / A = A xor B xor CI It doesnt print out the AND and XOR instructions , it performs them is a similar fashion, you can look up the AND I have written earlier, The load is done: iRM 3w 0 , 1 , Accum ; L i + n : iRM 3w A, 1 , Accum ; where the value of A is known at compile time from @A thats signified. IRM 3w is basically a bitwise resistive majority done on an entire word(iRM 3) . Resistive majority is done as majority of A,B',C It's quite complex How do you think the instruction definition would work for such an architecture. Thanks On Mon, Jun 5, 2017 at 6:26 PM, Sean Silva <chisophugis at gmail.com> wrote:> > > On Mon, Jun 5, 2017 at 1:45 PM, Sreejita saha <sreejitasaha2011 at gmail.com> > wrote: > >> Hey Sean, >> So the processor does in-memory computing, it reads instructions and >> operands from the memory array, performs the majority operations within the >> memory array itself. >> It does instructions using resistive majority which is AB'+B'C+AC >> Like it does AND operation as >> 1: 0, 1, @C; //C=0 >> 2: 0, 1, @Binv; //Binv=0 >> 3: 1, @B, @Binv; //Binv=B >> 4: @A, @Binv, @C; //C=A.B >> where each operation is a resistive majority and operations are directly >> performed on the storage of C. It reads @A in a register , @B , reads A >> and B and directly writes into the memory @C. There are shift operators as >> well that are also performed in a similar way, loads, stores are also >> performed like this. >> > > Can you show an example of the load/store and add/shift? For example, how > does your ISA represent this function? > > void add(int *dst, int *src0, int *src1) { > *dst = *src0 + *src1; > } > > -- Sean Silva > > >> So I am trying to define this resistive majority instruction in my ISA. >> >> Thanks! >> -Sreejita >> >> >> On Sun, Jun 4, 2017 at 8:22 PM, Sean Silva <chisophugis at gmail.com> wrote: >> >>> I'm having a hard time grasping what this ISA actually looks like. >>> >>> When you say that it has a single instruction that is a majority >>> function, I assume something like this: >>> >>> MAJ rDst <- rSrc0, rSrc1, rSrc2 >>> Semantics: >>> for (int i = 0; i < REGISTER_WIDTH; i++) { >>> rDst[i] = maj(rSrc0[i], rSrc1[i], rSrc2[i]); >>> } >>> Where maj(a, b, c) = (a & b) | (a & c) | (b & c) >>> >>> But that doesn't make sense given your question. >>> >>> MAJ is a bitwise operation, so how do you implement arithmetic >>> instructions with it? You would need at least one other instruction (such >>> as a bit shift) to establish dependency chains between bits. >>> >>> Also, how do you decompose load/store into majority functions? It's not >>> even clear to me what that would actually mean. You need to access the >>> memory/IO bus somehow, and if your only instruction only reads/writes to >>> registers, the only way to do that would be to have special registers that >>> interface to the IO bus? >>> >>> -- Sean Silva >>> >>> On Thu, Jun 1, 2017 at 8:13 PM, Sreejita saha via llvm-dev < >>> llvm-dev at lists.llvm.org> wrote: >>> >>>> Hello everyone, >>>> >>>> >>>> >>>> I was trying to create an LLVM backend for a processor with a very >>>> simple architecture and that does all instructions like load, store, >>>> arithmetic and logical instructions using a bunch of majority functions. >>>> The processor has only one instruction(majority function) in its ISA and >>>> breaks down all other instructions into a number of majority instructions >>>> depending on what instruction it is. All the instructions have different >>>> combinations of majority operations. Is there any way to implement this >>>> without creating a new Selection DAG node for the majority operation? >>>> >>>> I was thinking of creation of a new Selection DAG node and mapping all >>>> the other instructions like loads, stores as pseudo instructions and >>>> breaking them up. Can someone please help me with this? >>>> >>>> >>>> >>>> Thanks! >>>> >>>> Sreejita >>>> >>>> >>>> >>>> >>>> >>>> Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for >>>> Windows 10 >>>> >>>> >>>> >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> llvm-dev at lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>> >>>> >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170606/88921f87/attachment.html>