---
title: kupl_graph_submit
description: "向kupl图中添加task任务，从而供KUPL底层executor获取任务进行执行。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_038.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_038.html
indexId: 15951625075868d47c0cf16aad0cd15c9d1384eec26808542dbae23468cbb59f67
---
# kupl_graph_submit

向kupl图中添加task任务，从而供KUPL底层executor获取任务进行执行。

#### 接口定义


int kupl_graph_submit(kupl_graph_h graph, kupl_task_info_t *info);


#### 参数


**表1 参数定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| graph | kupl\_graph\_h | 需要向其中添加task的kupl graph | 输入 |
| info | kupl\_task\_info\_t \* | 需要添加的task的信息，具体见下表 | 输入 |


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

| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| type | kupl\_task\_type\_t | task 的具体类型，可以设置为： KUPL\_TASK\_TYPE\_SINGLE：动态图 task KUPL\_TASK\_TYPE\_SGRAPH：静态图 task KUPL\_TASK\_TYPE\_TASKLOOP: taskloop |
| desc | void \* | task 类型所对应的描述，可以设置为： kupl\_task\_desc\_t \*：动态图 task 对应的描述，具体见下表 kupl\_sgraph\_task\_desc\_t \*：静态图 task 对应的描述，具体见下表 kupl\_taskloop\_desc\_t \*: taskloop 对应的描述，具体见下表 |


**表3 kupl_task_desc_t的数据结构**

| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| field\_mask | uint32\_t | 掩码，用于指定结构体中哪些值有效，不设置掩码情况下仅func、args参数生效，其他需要设置掩码。 具体可设置的掩码： KUPL\_TASK\_DESC\_FIELD\_PRIORITY：priority生效 KUPL\_TASK\_DESC\_FIELD\_DEP：dep生效 KUPL\_TASK\_DESC\_FIELD\_NAME：name生效 KUPL\_TASK\_DESC\_FIELD\_FLAG：flag生效 |
| func | void (\*kupl\_task\_func\_t)(void \*args) | task的函数，task任务需要执行的具体函数 |
| args | void \* | func函数需要传入的参数 |
| name | const char \* | 需要配置掩码KUPL\_TASK\_DESC\_FIELD\_NAME后才生效；task任务的名字 |
| priority | int | 需要配置掩码KUPL\_TASK\_DESC\_FIELD\_PRIORITY后才生效；task任务的优先级，数值越大，优先级越高 |
| ndep | size\_t | 需要配置掩码KUPL\_TASK\_DESC\_FIELD\_DEP后才生效；动态图task中dep\_list中的depends数量，即任务传入的用于任务间依赖的参数数量 |
| dep\_list | kupl\_task\_dep\_t \* | 需要配置掩码KUPL\_TASK\_DESC\_FIELD\_DEP后才生效；动态图task中的depends 的列表，即任务传入的用于任务间依赖的参数列表 |
| flag | uint32\_t | 需要配置掩码KUPL\_TASK\_DESC\_FIELD\_FLAG后才生效；task任务的flag，可设置为KUPL\_TASK\_FLAG\_IMM，表示直接执行task，不需要调度 |


**表4 kupl_task_dep_t的数据结构**

| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| base\_addr | const void \* | dep参数的地址 |
| type | kupl\_task\_dep\_type\_t | dep的具体类型，可以设置为： KUPL\_TASK\_DEP\_TYPE\_IN：作为任务的输入参数 KUPL\_TASK\_DEP\_TYPE\_OUT：作为任务的输出参数 KUPL\_TASK\_DEP\_TYPE\_INOUT：作为任务的输入输出参数 KUPL\_TASK\_DEP\_TYPE\_ALL：该参数依赖之前的所有任务 |


**表5 kupl_sgraph_task_desc_t的数据结构**

| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| sgraph | kupl\_sgraph\_h | 需要提交的静态图 |
| name | const char \* | 需要配置掩码KUPL\_SGRAPH\_TASK\_DESC\_FIELD\_NAME后才能生效；静态图task的名字 |
| priority | int | 需要配置掩码KUPL\_SGRAPH\_TASK\_DESC\_FIELD\_PRIORITY后才能生效；静态图task的优先级，数值越大，优先级越高 |
| flag | uint32\_t | 需要配置掩码KUPL\_SGRAPH\_TASK\_DESC\_FIELD\_FLAG后才能生效；静态图task的flag，可设置为KUPL\_SGRAPH\_TASK\_FLAG\_IMM，表示直接执行静态图任务，不需要调度 |
| field\_mask | uint64\_t | 掩码，用于指定结构体中哪些值有效，不设置掩码情况下仅sgraph参数生效，其他需要设置掩码。 具体可设置的掩码： KUPL\_SGRAPH\_TASK\_DESC\_FIELD\_NAME：name生效 KUPL\_SGRAPH\_TASK\_DESC\_FIELD\_PRIORITY：priority生效 KUPL\_SGRAPH\_TASK\_DESC\_FIELD\_FLAG：flag生效 |


**表6 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：上述字段都生效 |
| func | void (\*kupl\_taskloop\_func\_t)(kupl\_nd\_range\_t \*nd\_range, void \*args) | taskloop 任务需要执行的具体函数 |
| args | void \* | func 函数需要传入的参数 |
| 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>

static inline void task_str(void *args)
{
    printf("graph task test.\n");
}

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_task_desc_t task_desc = {
        .field_mask = KUPL_TASK_DESC_FIELD_FLAG,
        .func = task_str,
        .args = NULL, 
        .flag = KUPL_TASK_FLAG_IMM,
    };
    kupl_task_info_t info = {
        .type = KUPL_TASK_TYPE_SINGLE,
        .desc = &task_desc,
    };

    int ret = kupl_graph_submit(graph, &info);
    assert(ret == KUPL_OK);

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

运行结果如下。

```
graph task test.
```

上述示例演示了向graph图提交task的流程。上述kupl_graph_submit函数提交的task的函数为task_str，函数不需要参数，task设置了flag生效且flag值设置为KUPL_TASK_FLAG_IMM；不需要获取特定的task。
