blob: 470b7a941a6548821a7ae827c9b6ac0bc6d4404c [file] [log] [blame]
// Copyright 2020 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef IREE_TASK_POST_BATCH_H_
#define IREE_TASK_POST_BATCH_H_
#include <stdbool.h>
#include "iree/base/config.h"
#include "iree/task/affinity_set.h"
#include "iree/task/executor.h"
#include "iree/task/list.h"
#include "iree/task/task.h"
#include "iree/task/tuning.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
typedef struct iree_task_worker_t iree_task_worker_t;
// Transient/stack-allocated structure for batching up tasks for posting to
// worker mailboxes in single operations. This avoids the need to repeatedly
// thrash caches during coordination as only during submission are the worker
// mailboxes touched and only once per worker.
typedef struct iree_task_post_batch_t {
iree_task_executor_t* executor;
// Local worker constructing the post batch.
// This is used to know when lighter-weight queuing can occur (no need to
// post across a mailbox channel to yourself!).
// May be NULL if not being posted from a worker (such as a submission).
iree_task_worker_t* current_worker;
// A bitmask of workers indicating which have pending tasks in their lists.
// Used to quickly scan the lists and perform the posts only when required.
iree_task_affinity_set_t worker_pending_mask;
// A per-worker LIFO task list waiting to be posted.
iree_task_list_t worker_pending_lifos[0];
} iree_task_post_batch_t;
void iree_task_post_batch_initialize(iree_task_executor_t* executor,
iree_task_worker_t* current_worker,
iree_task_post_batch_t* out_post_batch);
// Returns the total number of workers that the post batch is targeting.
iree_host_size_t iree_task_post_batch_worker_count(
const iree_task_post_batch_t* post_batch);
// Selects a random worker from the given affinity set.
iree_host_size_t iree_task_post_batch_select_worker(
iree_task_post_batch_t* post_batch, iree_task_affinity_set_t affinity_set);
// Enqueues a task to the given worker. Note that the pending work lists for
// each work is kept in LIFO order so that we can easily concatenate it with the
// worker mailbox slist that's in LIFO order.
void iree_task_post_batch_enqueue(iree_task_post_batch_t* post_batch,
iree_host_size_t worker_index,
iree_task_t* task);
// Submits all pending tasks to their worker mailboxes and resets state.
// Returns true if any tasks were posted to workers.
bool iree_task_post_batch_submit(iree_task_post_batch_t* post_batch);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_TASK_POST_BATCH_H_