From 05547582cc980769b7f606bab6d7b2735dcb8c95 Mon Sep 17 00:00:00 2001 From: Evan Williams Date: Mon, 11 Dec 2023 14:17:07 -0500 Subject: [PATCH] blog post --- content/blog/2023-12-11-AsyncBril.md | 328 +++++++++++++++++++++++++++ content/blog/eval.jpg | Bin 0 -> 75392 bytes 2 files changed, 328 insertions(+) create mode 100644 content/blog/2023-12-11-AsyncBril.md create mode 100644 content/blog/eval.jpg diff --git a/content/blog/2023-12-11-AsyncBril.md b/content/blog/2023-12-11-AsyncBril.md new file mode 100644 index 000000000..2577b50a8 --- /dev/null +++ b/content/blog/2023-12-11-AsyncBril.md @@ -0,0 +1,328 @@ ++++ +title = "AsyncBril: Enhancing Bril with Asynchronous Programming" +[[extra.authors]] +name = "Andy He" +[[extra.authors]] +name = "Emily Wang" +[[extra.authors]] +name = "Evan Williams" +[extra] +bio=""" +Andy He is a junior studying CS and Math. He is particularly interested in systems and compilers development. + +Emily Wang is an M.Eng student studying CS. She is very interested in systems, architecture, and compilers. + +Evan Williams is an M.Eng student studying CS. He is broadly interested in distributed systems and compilers. +""" ++++ +# AsyncBril: Enhancing Bril with Asynchronous Programming and Thread-Style Features +By Andy He, Emily Wang, and Evan Williams + +## Overview and Motivation + +In the final lecture of CS 6120, we talked about concurrency and parallelism and +the challenges they raise for compiler developers in the modern era of +computing. In particular, we examined how the problem of semantics is +inherently embedded in shared-memory multithreading and came across a key idea +by Boehm: threads cannot be implemented as a library. + +The end of Moore's law indicates a need for parallelism to sustain advances +in computing. Thus, our goal in this project was to implement asynchronous +programming features for Bril. Modern programming languages rely heavily on +asynchronous programming and multithreading to optimize performance and manage +complex tasks. We thought the best way to learn about how these features are +implemented in real languages was to try it for ourselves. Further, Bril's +easily extensible nature makes it ideal for experimentation. We thought that +future CS 6120 students would benefit from being able to use our library to +implement their own synchronization primitives and other asynchronous +programming features using our extension. + + +## Design and Implementation + +In this projet, we added two main features to Bril: promises and atomic +primitive types (i.e. `atomicint`). Promises are a fundamental +part of asynchronous programming. They allow the language to handle operations +that might take an unknown amount of time to complete (like I/O operations) +without blocking the execution of the rest of the program. Atomic operations are +crucial for safe concurrency. They ensure that operations on shared data are +completed as indivisible steps, preventing race conditions where multiple +threads might try to modify the same data simultaneously. + +To implement these new language features we directly modified the Rust +interpreter for Bril: `brilirs`. We chose to implement the feature in Rust for +a few reasons. First, the three of us are more experienced with Rust than we +are with TypeScript, so it seemed the natural choice for us. Second, we wanted +to take advantage of Rust's safe-concurrency features while implementing the +asynchronous extensions, since concurrency can be tricky to reason about. + +We did not want to make major changes to the structure of `brilirs`, and wanted our changes to be as modular as possible, as to minimize the changes needed to extend `brilirs` in the future. A major goal of ours while designing and implementing this extension was that we wanted to ensure that future contributors did not have to understand our work to build features that do not require asynchronous programming. For instance, any type extension in Bril will automatically be supported by AsyncBril. + +The heap is thread-unsafe, allowing multiple threads to concurrently read/write +to the heap without checking. This is done using Rust `unsafe` blocks. +Alternatively, we could've used a `Rw` to lock/unlock the heap when threads +were modifying it, but we ultimately decided that it would be more performant +to not implement it this way and provide support for synchronization primitives, +allowing for more flexibility. + +Although the interpreter's heap is not thread safe, calls to `alloc` are still +made atomically, so no thread can accidentally be assigned the same index +in `state.heap.memory` when `alloc` is called simultaneously between threads. + +### Promises + +We have introduced two critical syntax features to Bril: `Promise` and +`Resolve`, significantly enhancing its capabilities in threaded execution and +asynchronous programming. The core of this implementation lies in how threads +are created and managed. Upon encountering a function defined with a +`Promise` return type, a thread is immediately started. This allows for +concurrent function execution, enabling the language to handle complex, +asynchronous tasks more effectively. These threads have local stack and global +heap access, ensuring independent operation without interfering with each +other's state. However, they also access a global heap, which is crucial for +modifying pointers shared across threads. + +Here's an example of how our notion of promises is implemented in Bril: +``` +@main { + size: int = const 4; + size2: bool = const false; + prom: promise = call @mod size; + prom2: promise = call @mod2 size2; + x : int = resolve prom; + y : bool = resolve prom2; + print x; + print y; +} + +@mod(r: int): promise { + ret r; +} + +@mod2(r: bool): promise { + ret r; +} +``` + +This Bril program exemplifies the newly implemented asynchronous features in +the language, particularly demonstrating the use of `Promise` and the +`Resolve` mechanism. In the `@main` function, two promises are created: `prom` +and `prom2`. The `prom` is a promise of an integer (`promise`) and is +assigned the result of calling the `@mod` function with an integer argument +(`size`). Similarly, `prom2` is a promise of a boolean (`promise`) and is +linked to the outcome of the `@mod2` function, which is called with a +boolean argument (`size2`). + +These promises, once initialized, signify the start of asynchronous operations. +The `@mod` and `@mod2` functions, defined with return types `promise` and +`promise` respectively, indicate that the function will be execute +asynchronously. Each function simply returns the passed argument, but in a +real-world scenario, these could represent more complex operations executed in +separate threads. + +The use of the resolve keyword in the `@main` function is critical. `resolve` +is blocking and waits for the promise to be resolved to a value, synchronizes +the asynchronous function calls. The variables `x` and `y` are assigned the +resolved values of `prom` and `prom2`, respectively. The print statements at the +end of the `@main` function display these resolved values, showcasing how +asynchronous tasks can be integrated into the main flow of a Bril program. + +The `Resolve` feature, synchronized with the promise mechanism, is instrumental +in managing the life cycle of asynchronous operations. It allows threads to +signal the completion of tasks and communicate results back to the main +execution flow. + +Unresolved promises are automatically cleaned up when they go out of scope. This +is implemented through an atomic flag which indicates to all sub-threads to clean +up all resources used and abort. However, as this may cause undefined behavior +when interacting with the global heap, a warning is printed to indicate that a +promise was left unresolved. In general, all promises should be resolved. + +The introduction of these asynchronous capabilities necessitated a medium-sized +refactor of the `brilirs` interpreter, including parameterizing the types of +State to accommodate the new features. A significant enhancement is the use of +atomics in the Rust interpreter. The atomics ensure a consistent and thread-safe +mechanism to increment the dynamic count across all threads, which is crucial +for tracking and managing active threads. Overall, this implementation not only +enriches Bril with robust asynchronous programming and safe concurrency +management but also significantly extends its utility as a tool for learning +and experimenting with compiler design and parallel computing concepts. + + +### Atomics + +In the context of Bril, atomic primitives provide a way to perform certain +operations on integers in a way that is guaranteed to be atomic, meaning that +the operations are indivisible. This atomicity is crucial in multi-threaded +environments to prevent race conditions. Race conditions occur when two or more +threads access shared data and try to change it simultaneously. If one thread's +operations interleave with another's in an uncontrolled manner, it can lead to +inconsistent or unpredictable results. Atomics prevent this by ensuring that +operations like incrementing a value, setting it, or comparing and swapping it +happen as a single, uninterruptible step. + +A particularly powerful application of atomic primitives is in implementing +mutexes (mutual exclusion locks). Mutexes are a foundational concept in +concurrent programming, used to prevent multiple threads from accessing a +critical section of code simultaneously. By using atomic primitives to implement +mutexes, you can ensure that only one thread can enter a critical section at a +time, thereby protecting shared resources from concurrent access. + +In a typical mutex implementation using atomics, an atomic variable is used as +a lock flag. Before a thread enters a critical section, it uses atomic +operations to check and set this flag. If the flag indicates that the mutex +is already locked, the thread will wait (or "spin") until the flag changes. +This is often implemented using a compare-and-swap atomic operation, where the +flag is only set if it is currently in the expected unlocked state. Once the +thread has finished executing the critical section, it uses another atomic +operation to set the lock flag back to its unlocked state. + +Here's an example of how atomics work in Bril: +``` +@main { + one : int = const 1; + size : atomicint = newatomic one; + expect : int = const 1; + upd : int = const 2; + res : int = cas size expect upd; + + three : int = const 3; + res1 : int = loadatomic size; + res2 : int = swapatomic size three; + res3 : int = loadatomic size; + print res; + print res1; + print res2; + print res3; +} +``` + +In our Bril program, we demonstrate the use of atomic operations to manage a +shared atomic integer. The program starts by initializing a regular integer +`one` with a value of 1, which is then used to create an atomic integer `size` +through the `newatomic` operation. The utilization of atomic integers is crucial +in concurrent programming environments, as it ensures that the integer can be +safely read and modified by multiple threads without causing race conditions. + +We then perform a compare-and-swap (CAS) operation on the atomic integer `size`. +This atomic action is essential for achieving synchronization in multi-threaded +programs. The `cas` operation attempts to update `size` from its expected value +(`expect`, which is 1) to a new value (`upd`, which is 2). The success of this +operation, stored in `res`, hinges on whether the current value of `size` +matches the expected value, ensuring that the update occurs only if `size` has +not been altered by another thread. We print the result of this operation to +reflect its success or failure. + +Furthermore, we employ the `loadatomic` operation to safely read the current +value of `size` into `res1`, ensuring a consistent and uncorrupted value. +Following this, we use the `swapatomic` operation, which atomically swaps +`size`'s value with `three` (3). The previous value of `size` is captured in +`res2`. This swap operation is particularly useful for updating a shared +variable while simultaneously retrieving its old value. Another `loadatomic` +operation follows, storing the post-swap value of `size` in `res3`. + +Finally, our program concludes by printing the results of these operations +(`res`, `res1`, `res2`, and `res3`). This output showcases the effects of +atomic operations on the shared atomic integer, providing a clear example of +how atomics can be used to manage shared state in a concurrent environment +without the need for complex and potentially cumbersome lock-based +synchronization mechanisms. + +Elaborating more on how our atomics can implement a mutex lock and allow threads +to concurrently modify an array, here is another useful code snippet: +``` +@acquire_lock(lock: atomicint) { +.loop: + res: int = loadatomic lock; + one: int = const 1; + eq: bool = eq one res; + br eq .loop .acquire_lock; +.acquire_lock: + upd: int = add res one; + old: int = cas lock res upd; + eq: bool = eq old res; + br eq .end .loop; + .end: + ret; +} + +@release_lock(lock: atomicint) { + zero: int = const 0; + val: int = swapatomic lock zero; +} +``` + +The `@acquire_lock` function tries to acquire a lock on a shared resource +represented by `lock`, an atomic integer. The function first loads the current +value of `lock` atomically, and then loops to keep retrying to acquire the lock +if it's already being used by another thread. To attempt to acquire the lock, a +Compare-and-Swap (CAS) operation is used. + +The `@release_lock` function releases the lock. It sets the lock to `0` using +an atomic swap operation, indicating that the lock is free. The use of atomic +operations ensures that these lock acquire and release operations are +thread-safe and prevent race conditions in concurrent environments. + +## Challenges +The original implementation of `brilirs` was understandably not designed with +multithreading in mind. As a result, we had to change some of the architecture +of the data structures and main function headers. To simplify the design, +`State` no longer has a parameterized lifetime, and instead uses an atomic +reference counter, `Arc`, to hold the program and environment. Further, to +implement support for atomic ints, we needed a secondary state variable that +would all the instantiated atomics. We could not repurpose the heap for this, as +`Value` needs to derive the `Copy` trait, but this is not supported for Rust +`AtomicI64`. To remedy this, we added an additional data structure, modeled +after `Heap`, to store all atomics. + +## Evaluation + +To evaluate our extension, we primarily focused on two key attributes: +correctness and runtime. To evaluate the runtime gains from asynchronous +programming, consider the following simple benchmark: we use a loop that just +adds 1 to a variable. On the first thread it performs 2000000 iterations, on +the second thread it performs 1000000, and so on and so forth. One good example +of when a benchmark like this would be used is in multiplying two large matrices +together. Below, we show the execution time in miliseconds against the number +of threads used in the task: + +![Benchmark](eval.jpg) + +We observe that from 1 thread to 5 threads, we see substantial performance +improvements. This makes sense, as we are taking direct advantage of +parallelization in our programs. From 5 threads to 50 threads however, there +is actually a slight increase in the execution time. This also makes sense, +as increased number of threads requires more careful resource allocation by +the operating system. Since our implementation requires locks on the global +heap, more threads means more actors vying for the locked resources, +causing a general slowdown in overall performance. + +To evaluate the correctness of our programs we noted that it is not particularly +useful to use pre-existing Bril benchmarks, as none of them are written with +asynchronous features in mind. We instead took a different approach. We can look +at asynchronous Bril programs that are implemented *incorrectly* and then +observe the behavior that is different from the expected behavior. In other +words, concurrent array accesses with variables that are not atomic will lead +to undefined behavior. Likewise, when atomics are used correctly the result +of the program is deterministic and predictable. This can easily be observed +by taking the Bril program above used to showcase atomics and removing the +atomicity of the integer (i.e. make it an `int` instead of an `atomicint`). +We quickly see why the atomics are necessary, and how it guarantees the +correctness of the program. + +Overall evaluating asynchronous programming features can be challenging, but +we believe that through our thorough testing within the interpreter and our +Bril benchmarks that we have created a robust extension that can be used by +many future Bril users. + +## Conclusion + +Concurrent programming is hard to understand, and it is important to begin +to understand how to implement concurrent programming features at the compilers +level. As we noted at the start, threads cannot be implemented as a library - +threading is inherently embedded into the semantics of the language. We gained +a lot of experience in this project with asynchronous programming and +concurrent programming features in Rust. Overall, we are excited to see this +extension be used in future iterations of CS 6120, and hope that more students +will build upon the work we've done to create many interesting optimizations +involving parallel programming in Bril. diff --git a/content/blog/eval.jpg b/content/blog/eval.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43c2e1d5512976f892cd9f6f71dca2ba32779345 GIT binary patch literal 75392 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 wwu93J=%@ZiW#IS!`P=W=<@3J