---
title: kupl::graph_submit(taskloop)
description: "向kupl图中添加taskloop，即提交执行taskloop任务。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_040.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_040.html
indexId: a9fc99094e407228d3597ec14968dcf59c82fe94e67fe47192e68b2bd088a3f567
---
# kupl::graph_submit(taskloop)

向kupl图中添加taskloop，即提交执行taskloop任务。

相较于kupl_graph_submit接口而言，该接口通过lambda函数特性捕获kupl_graph_submit提交任务回调函数的入参， 避免用户入参封装行为，提高接口易用性。

相较于kupl::graph_submit(task)接口而言，该接口提交任务为taskloop类型。两者的差异主要在函数接口的入参上，采用C++函数重载的能力进行实现。

#### 接口定义

int kupl::graph_submit(kupl_graph_h graph, kupl_taskloop_desc_t* desc, const std::function<void(const kupl_nd_range_t *)> &func);


#### 参数


**表1 参数定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| graph | kupl\_graph\_h | 需要向其中添加taskloop的kupl graph | 输入 |
| desc | kupl\_taskloop\_desc\_t \* | 需要添加的taskloop的描述，具体见下表 | 输入 |
| func | std::function<void(const kupl\_nd\_range\_t \*)> | taskloop的函数，taskloop任务需要执行的具体函数 | 输入 |


**表2 kupl_taskloop_desc_t 的数据结构**

| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| field\_mask | uint64\_t | 结构体中有效字段的掩码，使用 kupl\_taskloop\_desc\_field 中的位标识。此掩码中未指定的字段将被忽略。当前所有字段都为必填项。 具体可设置的掩码： KUPL\_TASKLOOP\_DESC\_FIELD\_RANGE：range生效 KUPL\_TASKLOOP\_DESC\_FIELD\_EGROUP：egroup生效 KUPL\_TASKLOOP\_DESC\_FIELD\_DEFAULT：上述字段都生效 |
| range | kupl\_nd\_range\_t \* | taskloop 范围，详细使用方式见 kupl\_parallel\_for 章节 |
| egroup | kupl\_egroup\_h | 执行 taskloop 任务的 egroup，即能在哪个 egroup 中的 executor 执行器上执行 |


#### 返回值

- 成功：返回KUPL_OK
- 失败：返回KUPL_ERROR


#### 示例

```
#include <stdio.h> 
#include "kupl.h" 
#include <assert.h>

int main() 
{ 
    int executor_num = kupl_get_num_executors(); 
    int executors[executor_num]; 
    for (int i = 0; i < executor_num; i++) {
        executors[i] = i;
    } 
    kupl_egroup_h egroup = kupl_egroup_create(executors, executor_num);
    kupl_graph_h graph = kupl_graph_create(egroup); 
    kupl_nd_range_t range;
    KUPL_1D_RANGE_INIT(range, 0, executor_num);
    kupl_taskloop_desc_t taskloop_desc = {
        .field_mask = KUPL_TASKLOOP_DESC_FIELD_DEFAULT,
        .range = &range,
        .egroup = egroup
    };
    int ret = kupl::graph_submit(graph, &taskloop_desc, [](const kupl_nd_range_t *nd_range) {
        printf("graph taskloop test\n");
    }); 
    assert(ret == KUPL_OK);

    kupl_graph_wait(graph);
    kupl_egroup_destroy(egroup);
    return 0;
}
```

运行结果如下。

```
graph taskloop test.
graph taskloop test.
graph taskloop test.
graph taskloop test.
```

上述示例演示了向graph图提交taskloop的流程。
