---
# System prepended metadata

title: Parallel Rustc Work List

---

# Parallel Rustc Work List

## make nightly compilers able to parallelize

The goal is to reduce the efficiency regression with `-Zthread=1` to within 1% compared to the non-parallel compiler

https://github.com/rust-lang/rust/pull/101566

- [x] Work1. Continuously analyze the specific reasons for the performance regression caused by the parallel compiler when `-Zthreads=1`, and initially formulate a solution.
- [x] Work2. Find a good way to reconstruct the `Lock` data structure so that the cost of parallelization is acceptable while remaining   thread-safety.
- [ ] Work3. Refactor other shared data structures to eliminate all conditional compilation code of `parallel_compiler`

There is no strong dependency between the above tasks, so they can be addressed in parallel.

| reason                                                       | initial solution                                             |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| `Mutex` is too heavy than `RefCell` in `Lock` struct                                 | 1.  Use `RefCell` when threads=1 and `Mutex` when threads > 1 in `Lock` struct. We can use `DynSend` and `DynSync` auto trait to ensure thread safety here |
make `GatedSpans` when parsing                               | Move `gated_spans` from `ParseSess` to `Parser` to avoid `Lock::lock()` |
| Access `Lock` in `HygieneEncodeContext` when encoding metadata | Change `hygiene_ctxt` in `EncodeContext` from `&'a HygieneEncodeContext` to `HygieneEncodeContext` to delete `Lock` |
| use unnecessary Lock in infcx's caches | use RefCell in infcx's `selection_cache` and `evaluation_cache` |
use `Lock` in SourceFile | use `RwLock` in `SourceFile.external_src` and `SourceFile.lines` |
| ...                                                          |                                                              |


## Adaptation of rustc-perf to parallel compilers

Improve rustc-perf's support for parallel compilers. The lead developers for this part of the work are @nnethercote and @Jakub Beránek.

- [ ] // discussion needed

## Test for parallel compilers

- [ ] The current ui tests is only tested for `-Zthreads=1`, we should increase the test under multiple threads.
- [ ] Deal with the output order of diagnostic information under multi-threading
- [ ] Benchmarks for parallel compilers. Such as the number of calls to `Lock` and the blocking time of each thread. A related issue form @bjorn3 [here](https://github.com/rust-lang/rust/issues/92596).

## Deepen compiler parallelism

Analyze the feasibility of parallelizing other parts of compilation process

- [ ] Lex parsing
- [ ] Expansion (with import resolving)
- [ ] name resolving
- [ ] linking
...

