开发者
资源
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

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

示例

一维示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#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求和的值。