[LLVMdev] Re: idea 10

"?=Valery A.Khamenya=?koi8-r?Q?" khamenya at mail.ru
Thu Jan 8 08:20:03 PST 2004


> I see more precisely what you mean, but I don't think it is that 
> straightforward to generalise the benefits multiple CPU on single host 
> programming to multiple CPU at multiple hosts. I don't think that both 
> cases involve the same techniques.

you are right, just think of shared memory.
 
> For example, in "single host" configuration you get a very low cost for 
> communicating data because you use memory instead of network. Memory is 
> [...]

you are right, that's exactly the point. 
I'd never tell that the difference is tiny.

> 
> What would you consider as the core primitives of single host, multi-CPU 
> programming ?

if LLVM would be really "low-level", then 
I would consider a generalized CALL as such a primitive, 
i.e. where not only address of subroutine is supplied, 
but the address of host as well.

something like 

call host:subr_address

However LLVM is very high-level !

It is so high-level, that I'd propose ...not include 
any primitives at LLVM language at all ! 
(So, Se'bastien, sry for answering "rather yes" about UCP)

Indeed, let's consider Fib example:

//------------
int f(int n) {
  if(n<2) return 1;
  return f(n-1) + f(n-2);
}
//------------

in this LLVM byte code output:

---------------------------------------------------
target endian = little
target pointersize = 32

implementation   ; Functions:

int %f(int %n) {
entry:
	br label %tailrecurse

tailrecurse:		; preds = %entry, %endif
	%cann-indvar = phi uint [ 0, %entry ], [ %next-indvar, %endif ]		; <uint> [#uses=2]
	%accumulator.tr = phi int [ 1, %entry ], [ %tmp.9, %endif ]		; <int> [#uses=2]
	%cann-indvar = cast uint %cann-indvar to int		; <int> [#uses=1]
	%n.tr-scale = mul int %cann-indvar, -2		; <int> [#uses=1]
	%n.tr = add int %n.tr-scale, %n		; <int> [#uses=2]
	%next-indvar = add uint %cann-indvar, 1		; <uint> [#uses=1]
	%tmp.1 = setle int %n.tr, 1		; <bool> [#uses=1]
	br bool %tmp.1, label %then, label %endif

then:		; preds = %tailrecurse
	ret int %accumulator.tr

endif:		; preds = %tailrecurse
	%tmp.5 = add int %n.tr, -1		; <int> [#uses=1]
	%tmp.3 = call int %f( int %tmp.5 )		; <int> [#uses=1]
	%tmp.9 = add int %tmp.3, %accumulator.tr		; <int> [#uses=1]
	br label %tailrecurse
}
---------------------------------------------------

BTW, it was quite impressive for me, that I've found 
only a one call in the LLVM output... :)

Anyway, above we have:

  call int %f( int %tmp.5 )

and it is a quite high-level statement i'd say!

Indeed, LLVM will allocate registers and regular memory for us.
This output is free of any strategy of this allocation.
We do *not* define strategy of this allocation and we are even quite happy with that!

Therefore I could expect, that allocation of CPU could be also a internal back-end problem of the LLVM like registers.

In other words, indirectly, I propose to treat CPUs as the 
same resource class as memory :-)

Chris, LLVMers, could you allocate CPUs resources as you do it for registers and memory? :P

Actually, maybe the problem is that scince is not ready arround 
phi-functions, SSA and so on, if we speak about calculating 
machine with several CPUs spread via network... What could 
LLVM-gurus say here?

--
Valery.




More information about the llvm-dev mailing list