kupl::queue_submit
向 queue 提交需要执行的 kernel

该接口需要使用 c++ 编译器, range 目前只支持 1d。
接口定义
int kupl::queue_submit(kupl_queue_h queue, kupl_queue_kernel_desc_t *desc, const std::function<void(const kupl_nd_range_t *)> &kernel);
参数
参数名 |
类型 |
描述 |
输入/输出 |
---|---|---|---|
queue |
kupl_queue_h |
执行 kernel 的 queue |
输入 |
desc |
kupl_queue_kernel_desc_t |
kernel 的描述 |
输入 |
kernel |
const std::function<void(const kupl_nd_range_t *)> |
kernel 的内容,一般是 lambda 表达式 |
输入 |
参数名 |
类型 |
描述 |
---|---|---|
range |
kupl_nd_range_t * |
kernel 的 range 信息,必选 |
egroup |
kupl_egroup_h |
kernel 可用的 executor 信息,必选 |
name |
const char * |
kernel 的名字,可选 |
field_mask |
uint32_t |
kernel 描述的掩码,用于表示哪些参数启用,必选。不开启选项时填 0。 可用选项: KUPL_QUEUE_KERNEL_DESC_FIELD_NAME |
返回值
成功:返回 KUPL_OK
失败:返回 KUPL_ERROR
示例
#include <atomic> #include <assert.h> #include "kupl.h" int main() { auto queue = kupl_queue_create(); const int num_executors = 10; kupl_nd_range_t range; KUPL_1D_RANGE_INIT(range, 0, num_executors, 1); int exe[num_executors]; for (int i = 0; i < num_executors; i++) { exe[i] = i; } kupl_egroup_h egroup = kupl_egroup_create(exe, num_executors); kupl_queue_kernel_desc_t desc = { .range = &range, .egroup = egroup, .field_mask = 0, }; std::atomic<size_t> sum(0); const size_t count = 1000000; size_t sum_cal = (1 + count) * count / 2; size_t *data = (size_t *)malloc(count * sizeof(count)); for (size_t i = 0; i < count; i++) { data[i] = i + 1; } int ret = kupl::queue_submit(queue, &desc, [&](const kupl_nd_range_t *nd_range) { int start_index = nd_range->nd_range[0].lower * (count / num_executors); for (size_t i = 0; i < count / num_executors; i++) { sum += data[start_index + i]; } }); assert(ret == KUPL_OK); kupl_queue_wait(queue); assert(sum.load() == sum_cal); printf("sum: %lu\n", sum.load()); kupl_egroup_destroy(egroup); kupl_queue_destroy(queue); }
运行结果如下。
sum: 500000500000

上述示例演示了向 queue 提交 kernel,在 10 个线程上计算一个长度为 1000000 的数组总和,并等待直到 queue 上全部 kernel 执行完成的流程,最终和直接计算的结果相比较,并输出结果。
父主题: 多队列多流编程函数