idle: Use barriers instead to hang the core

This commit is contained in:
Hansung Kim
2024-06-22 01:37:00 -07:00
parent 11e6d34e1c
commit 02feb36b12

View File

@@ -12,23 +12,28 @@
#define HW_TID() ({uint32_t gtid; asm volatile ("csrr %0, mhartid" : "=r" (gtid)); gtid;})
void kernel_body(int task_id, kernel_arg_t *__UNIFORM__ arg) {
constexpr uint32_t timer = 50000;
uint32_t counter = 0;
while ((counter++) < timer) {
asm("");
}
// constexpr uint32_t timer = 50000;
// uint32_t counter = 0;
// while ((counter++) < timer) {
// asm("");
// }
//
// to prevent optimize-out
// reinterpret_cast<uint32_t *>(arg->addr_c)[0] = counter;
// call barrier in a divergent branch, which will hang the core
if ((vx_thread_id() % NUM_THREADS) == 0) {
vx_barrier(0, NUM_WARPS);
}
vx_tmc(0);
}
int main() {
kernel_arg_t *arg = (kernel_arg_t *)KERNEL_ARG_DEV_MEM_ADDR;
// const uint32_t num_threads_in_cluster = NUM_THREADS_IN_CLUSTER;
// const uint32_t grid_size = num_threads_in_cluster * NUM_CLUSTERS;
const uint32_t grid_size = 1;
// spawn a single warp in every core
const uint32_t grid_size = NUM_THREADS * NUM_CORES;
#ifdef RADIANCE
vx_spawn_tasks_cluster(grid_size, (vx_spawn_tasks_cb)kernel_body, arg);
#else