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);
参数
参数名 |
类型 |
描述 |
输入/输出 |
|---|---|---|---|
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 * |
规约参数,定义了总的规约操作数,具体规约操作的数据类型,规约操作类型,以及规约数据地址。 |
输入输出 |
参数名 |
类型 |
描述 |
|---|---|---|
num |
int |
规约操作的数量 |
items |
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求和的值。