鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

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);

参数

表1 参数定义

参数名

类型

描述

输入/输出

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 表达式

输入

表2 kupl_queue_kernel_desc_t 的数据结构

参数名

类型

描述

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 执行完成的流程,最终和直接计算的结果相比较,并输出结果。