51 | | The kernel initialization is done in parallel in all clusters, by the kernel idle threads, where there is one idle thread per core. These threads allocate and initialize shared and distributed data structures, such as the cluster managers, the cores schedulers, or the Virtual File System. This requires synchronization barriers. |
| 51 | The kernel initialization is done in parallel in all clusters, by the kernel ''idle'' threads, where there is one ''idle'' thread per core. These threads allocate and initialize shared and distributed data structures, such as the cluster managers, the cores schedulers, or the trans-cluster Virtual File System, or the trans-cluster DQDT. This requires synchronization barriers. |
54 | | * The local barriers are used to synchronize all idle threads in a given cluster K. The number of expected threads is defined by the number of cores in cluster K, that is registered in the local boot_info structure. |
55 | | * The global barrier is used to synchronize all threads running on the first core (Core 0) of each cluster. The number of expected threads is defined by the total number of active clusters (containing one kernel instance), that is also registered in each local boot_info structure. |
| 54 | * The local barriers are used to synchronize all idle threads in a given cluster K. The number of expected threads on a local barrier is defined by the number of cores in cluster K, that is obtained by the boot-loader, and registered in the local boot_info structure. |
| 55 | * The global barrier is used to synchronize all threads running on the first core (Core 0) of each cluster. The number of expected threads on the global barrier is defined by the total number of active clusters (i.e. containing one kernel instance), that is also registered in each local boot_info structure. |
57 | | These barriers being used only during kernel initialization implement a simple busy-waiting policy. They are implemented as global variables, in the kdata segment. These toggle barriers can be used several times, and don't need to be explicitly initialized. For the global barrier (''xbarrier''), the client threads use remote_read() remote_write(), & remote_atomic_add() primitives, to access the barrier located in cluster 0. |
| 57 | These barriers being used only during kernel initialization implement a simple busy-waiting policy. They are implemented as global variables, in the kdata segment. These toggle barriers can be used several times, and don't need to be explicitly initialized. For the global barrier (''xbarrier''), the client threads use ''remote_read(), remote_write(), & remote_atomic_add()'' primitives, to access the barrier located in cluster 0. |