---
title: kupl_parallel_for_reduce
description: "执行并行归约"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_233.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_233.html
indexId: 5f82b337f028580fe4cb17a8008f63c970a72357efd6b9f827e669df2221436067
---
# kupl_parallel_for_reduce

执行并行归约

#### 接口定义

int kupl_parallel_for_reduce(kupl_parallel_for_desc_t *desc, kupl_pf_reduce_func_t func, void *args,

kupl_reduce_args_t *rd_args);


#### 参数


**表1 参数定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| desc | kupl\_parallel\_for\_desc\_t \* | 并行迭代任务的描述，指向kupl\_parallel\_for\_desc\_t结构体的指针，具体参考 kupl\_parallel\_for 章节的定义 | 输入 |
| func | kupl\_pf\_reduce\_func\_t | 并行规约的函数，该函数必须定义为如下形式：void (\*kupl\_pf\_reduce\_func\_t)(kupl\_nd\_range\_t \*nd\_range, void \*args, int tid, int tnum, kupl\_reduce\_args\_t \*rd\_args)；其中nd\_range表示经过kupl\_parallel\_for内部处理后该函数实际执行的循环区域，args为该结构体传入的args参数，tid与tnum表示当前函数执行所在线程编号与总线程数，rd\_args 表示规约参数的线程副本，具体定义参考下方 kupl\_reduce\_args\_t的定义 | 输入 |
| args | void \* | func函数需要传入的参数 | 输入 |
| rd\_args | kupl\_reduce\_args\_t \* | 规约参数，定义了总的规约操作数，具体规约操作的数据类型，规约操作类型，以及规约数据地址。 | 输入输出 |


**表2 kupl_reduce_args_t的数据结构定义**

| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| num | int | 规约操作的数量 |
| items | kupl\_reduce\_item\_t \* | 指向具体规约操作定义的指针，详细定义请参见下方 |


**表3 kupl_reduce_item_t的数据结构定义**

| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| buffer | void \* | 规约操作的数据地址 |
| type | kupl\_datatype\_t | 规约操作的数据类型，包括： KUPL\_DATATYPE\_INT, KUPL\_DATATYPE\_FLOAT, KUPL\_DATATYPE\_DOUBLE, KUPL\_DATATYPE\_FLOAT\_COMPLEX, KUPL\_DATATYPE\_DOUBLE\_COMPLEX |
| op | kupl\_reduce\_op\_t | 规约操作的操作类型，包括： KUPL\_RD\_ADD, KUPL\_RD\_SUB, KUPL\_RD\_MAX, KUPL\_RD\_MIN |


#### 返回值

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


#### 示例

一维示例：

```
#include <stdio.h>
#include <pthread.h>
#include "kupl.h"
static inline void task_in_loop_reduce(kupl_nd_range_t *nd_range, void *args, int tid, int tnum, kupl_reduce_args_t *rd_args)
{
    int *data = (int *)args;
    int localsum = 0;
    for (int i = nd_range->nd_range[0].lower; i < nd_range->nd_range[0].upper; i += nd_range->nd_range[0].step) {
        localsum += data[i];
    }
    *(int *)rd_args->items[0].buffer += localsum;
}

int main()
{
    const int n = 100;
    int data[n];
    for (int i = 0; i < n; i++) {
        data[i] = i + 1;
    }
    kupl_nd_range_t range;
    KUPL_1D_RANGE_INIT(range, 0, n);


    kupl_parallel_for_desc_t desc = {
        .field_mask = KUPL_PARALLEL_FOR_DESC_FIELD_DEFAULT,
        .range = &range,
        .egroup = NULL,
        .concurrency = 4,
        .policy = KUPL_LOOP_POLICY_STATIC
    };
    int sum_int = 0;
    kupl_reduce_item_t param_int[1] = {{ .buffer = &sum_int, .type = KUPL_DATATYPE_INT, .op = KUPL_RD_ADD }};
    kupl_reduce_args_t rd_args_int = { .num = 1, .items = param_int };
    kupl_parallel_for_reduce(&desc, task_in_loop_reduce, data, &rd_args_int);
    printf("sum: %d\n", sum_int);
}
```

运行结果如下。

```
sum: 5050
```

上述示例演示了KUPL执行并行规约的流程，计算了数组 data 中所有数值1-100求和的值。
