On Mon, Feb 29, 2016 at 7:44 AM, Thierry Goubier
<thierry.goub...@gmail.com> wrote:
> Le 29/02/2016 00:32, Ben Coman a écrit :
>>
>> On Sat, Feb 27, 2016 at 3:30 AM, Dimitris Chloupis
>> <kilon.al...@gmail.com> wrote:
>>>
>>> So now that AsmJit is gone , I had a new idea for a project and I wanted
>>> your opinion on this if you think it will be useful for the community, I
>>> call it WarpSpeed.
>>>
>>> I was thinking it would still be cool to have some kind of library that
>>> will
>>> help us boost the speed of pharo . So I was thinking about a C inliner
>>> which is far easier than an Assembly inliner (see AsmJIT)  I also found
>>> TinyC
>>>
>>> http://bellard.org/tcc/
>>>
>>>   which is as you guessed a tiny c compiler 100kbs in size which i can
>>> include with a pharo image to allow me to dynamically compile inlined C
>>> code
>>> inside the pharo image so even pharo users without a C compiler installed
>>> can benefit from it .
>>>
>>> That means that if something does not perform as fast as you want you
>>> could
>>> mix C code with pharo code , I am thinking passing the C source code as a
>>> string or even having the C code in a separate file, and then dynamically
>>> call the TinyC compiler, compile it to shared library and load if via
>>> UFFI
>>> back to pharo. TinyC is very fast so compilation of the code should be as
>>> fast if not faster than compiling pharo code.
>>>
>>> Looks easy enough to do for a small project by me with the condition
>>> there
>>> are people really interested into something like this. TinyC is licensed
>>> as
>>> LGPL but I can make it fall back to other compilers as well if ones want
>>> to
>>> close the source.
>>>
>>> How it sounds as an idea ?
>>
>>
>> I've thought about something similar myself, and also looked at tcc.
>> I think its a really interesting idea, but you need to treat it as an
>> *experiment* for learning.  Whether its ultimately useful to the
>> community will depend on a lot of things in implementation (I see
>> Clement indicates some difficulties).
>>
>> But maybe tcc is not the right backend. [1] says "Note: I am no longer
>> working on TCC", the last release dates wehre 2009 & 2013, and [2]
>> indicates it tcc may be a dead end.
>>
>> What would be *really* interesting is, given we have a good
>> infrastructure to compile Smalltalk to bytecode, investigate some new
>> constructs to compile  to SPIR-V [3].  The specification [4] and
>> execution/memory model [5] have recently been released. It would be
>> nice if someone more competent than myself could skim and advise on
>> the feasibility of such an idea.
>
>
> SPIR-V format is similar to the LLVM-IR and it is quite hard to generate for
> a language like Smalltalk. Typed operations, SSA, Phi nodes, etc... You get
> extremely high performance this way, but it is a lot of work.
>
>> This presentation [6] starting p38 says SPIRV presents an "opportunity
>> to unleash innovation: Domain Specific Languages..." which is
>> typically considered a strength of Smalltalk. p40 says "Compiler split
>> in two, Front end compiler emits SPIR-V portable binary offline (that
>> would be us), then SPIR-V is compiled to machine-specific binary by
>> driver online (that would be just passing the SPIR-V to the GPU
>> driver). [7]
>
>
> Yes, this is certainly where SPIR-V is interesting: all OpenCL devices would
> carry a SPIR-V back-end compiler.
>
>> Perhaps interesting to see what people are trying in some other
>> languages...
>> * A bytecode translator like is being tried for Python [A], since SPIR-V
>> is
>> * End-user tools for working with SPIR-V, disassembling, analysing,
>> debugging, optimising it, for Go[B] and Python[C].
>>
>> The opportunity in producing tools for working with SPIR-V is you draw
>> people in for the tool, and they get a side-exposure to our
>> environment, (which of course they then fall in love with.)


> The opportunity is more like a compiler infrastructure you'll be writing. If
> well written, yes, it could be an interesting artefact (training, teaching
> compilation).

Back to Dimitris' original question, I wonder that the potential speed
benefit comes not so much from using "C", but from leveraging a large
body of work on optimizing passes at the lower level.  I found a
tutorial [1] to produce a toy language "Kaleidoscope" that generates
LLVM IR such that "by the end of the tutorial, we’ll have written a
bit less than 1000 lines of code. With this small amount of code,
we’ll have built up a very reasonable compiler for a non-trivial
language including a hand-written lexer, parser, AST, as well as code
generation support with a JIT compiler."

As well as a C++ version, there is also an OCaml version of the
tutorial [2], which makes me wonder what a Pharo version of the
tutorial would look like.  This seems like a reasonable level for a
student project.  Know any students keen to try?

[1] http://llvm.org/docs/tutorial/LangImpl1.html
[2] http://llvm.org/docs/tutorial/index.html
[3] http://llvm.org/docs/tutorial/PharoLangImpl1.html


The project outline might be...

1. Implement Kaleidoscope via the existing C++ tutorial

2. In Pharo, write a minimal FFI interface to LLVM

3. Re-implement the Kaleidoscope tutorial in Pharo in its simplest
form, following the existing tutorial's philosophy "to make this
tutorial maximally understandable and hackable, we choose to implement
everything in C++ instead of using lexer and parser generators" -
matching the existing tutorial as close as possible to ease acceptance
to...

4. Submit Pharo version of Kaleidoscope tutorial for inclusion on the
LLVM site [3].  This would provide a showcase of Pharo to a group we'd
probably never get a look in from**.  In particularly where section
3.5 says "code generation to LLVM doesn’t really get us much, except
that we can look at the *pretty* IR calls" , we could demonstrate the
ease of extending our Inspector with custom views, versus their
textual presentation.

5. Revise the tutorial to make optimal use of our built in AST infrastructure.


I naively wonder if it could be possible or beneficial for Slang to
generate LLVM IR directly and cherry pick optimisation passes, with
the ability to use in-image tools to review before & after
transformation of each pass, rather than generating C first and only
getting the final result.


** We operate in an attention scarcity economy.  Saying "come and look
at this great Thing we've got" is often not enough.  It helps to be
able to say "this Thung your interested in, here's another way to look
at it (using Thing.)"  Perhaps there's even an outside chance to snag
passing interest from random LLVM guys in our Cog/Spur/Sista JIT
technology.


cheers -ben

Reply via email to