<div dir="ltr">Congrats James! May all the threads of your life scale well! --Marco<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Apr 23, 2014 at 1:52 PM, Robby Findler <span dir="ltr"><<a href="mailto:robby@eecs.northwestern.edu" target="_blank">robby@eecs.northwestern.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">James successfully defended his dissertation today. Below is a taste.<br>
<br>
Congrats, James!<br>
<br>
Robby<br>
<br>
<br>
Many modern high-level or scripting languages are implemented around<br>
an interpretive run-time system, often with a JIT compiler. Examples<br>
include the Racket runtime system, the Parrot virtual machine, and the<br>
virtual machines underlying Perl, Python, Ruby, and other<br>
productivity-oriented languages. These runtime systems are often the<br>
result of many man-years of effort, and they have been carefully tuned<br>
for capability, functionality, correctness, and performance.<br>
<br>
For the most part, such runtime systems have not been designed to<br>
support parallelism on multiple processors. Even when a language<br>
supports constructs for concurrency, they are typically implemented<br>
through co-routines or OS-level threads that are constrained to<br>
execute one at a time.<br>
<br>
This limitation has become a serious issue, as it is clear that<br>
exploiting parallelism is essential to harnessing performance in<br>
future processor generations. Whether computer architects envision the<br>
future as involving homogeneous or heterogeneous multicores, and with<br>
whatever form of memory coherence or consistency model, the common<br>
theme is that the future is parallel and that language implementations<br>
must adapt. The essential problem is making the language<br>
implementation safe for low-level parallelism, i.e., ensuring that<br>
even when two threads are modifying internal data structures at the<br>
same time, the runtime system behaves correctly.<br>
<br>
One approach to enabling parallelism would be to allow existing<br>
concurrency constructs to run in parallel, and to rewrite or revise<br>
the runtime system to carefully employ locking or explicit<br>
communication. Experience with that approach, as well as the<br>
persistence of the global interpreter lock in implementations for<br>
Python and Ruby, suggests that such a conversion is extremely<br>
difficult to perform correctly. Based on the even longer history of<br>
experience in parallel systems, one would also expect the result to<br>
scale poorly as more and more processors become available. The<br>
alternative of simply throwing out the current runtime and<br>
re-designing and implementing it around a carefully designed<br>
concurrency model is no better, as it would require discarding years<br>
or decades of effort in building an effective system, and this<br>
approach also risks losing much of the language’s momentum as the<br>
developers are engaged in tasks with little visible improvement for a<br>
long period.<br>
<br>
This dissertation investigates a new technique for parallelizing<br>
runtime systems, called slow-path barricading. The technique is based<br>
on the observation that the core of many programs – and particularly<br>
the part that runs fast sequentially and could benefit most from<br>
parallelism – involves relatively few side effects with respect to the<br>
language implementation’s internal state. Thus, instead of wholesale<br>
conversion of the runtime system to support arbitrary concurrency, we<br>
add language constructs that focus and restrict concurrency where the<br>
implementation can easily support it.<br>
<br>
Specifically, the set of primitives in a language implementation is<br>
partitioned into safe (for parallelism) and unsafe categories. The<br>
programmer is then given a mechanism to start a parallel task; as long<br>
as the task sticks to safe operations, it stays in the so-called fast<br>
path of the implementation and thus is safe for parallelism. As soon<br>
as the computation hits a barricade, the runtime system suspends the<br>
computation until the operation can be handled in the more general,<br>
purely sequential part of the runtime system.<br>
<br>
Although the programming model allows only a subset of language<br>
operations to be executed in parallel, this subset roughly corresponds<br>
to the set of operations that the programmer already knows (or should<br>
know) to be fast in sequential code. Thus, a programmer who is<br>
reasonably capable of writing fast programs in the language already<br>
possesses the knowledge to write a program that avoids unsafe<br>
operations—and one that therefore exhibits good scaling for<br>
parallelism. Furthermore, this approach enables clear feedback to the<br>
programmer about when and how a program uses unsafe operations.<br>
<br>
<br>
Thesis: We can incrementally add effective parallel programming<br>
primitives and tool support to legacy sequential runtime systems with<br>
a modest investment of effort.<br>
<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div><br><br clear="all"><br>-- <br><br>Cheers,<br><br>Marco<br><br>Have a´¨)<br>¸.·´¸.·*´¨) ¸.·*¨)<br>(¸.·´ (¸.·´ * wonderful day! :)
</div>