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 执行完成的流程,最终和直接计算的结果相比较,并输出结果。
父主题: 多队列多流编程函数