鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

makeShare

调用此函数对原始数据进行分片,分为计算方0节点和非计算方1节点,当为计算方时先设置isRecvShare为1用于接收非计算方发送的分片,后设置isRecvShare为0用于分片自身的数据。当为非计算方时设置isRecvShare为0用于分片自身的数据,并将分片发送给计算方。

int makeShare(
    DG_TeeCtx *dgTeeCtx,
    int isRecvShare,
    DG_TeeMatInput *input,
    DG_MpcMatShare **share 
)

参数

参数名

描述

取值范围

输入/输出

dgTeeCtx

KCAL上下文信息

initTeeCtx成功初始化的结果

输入

isRecvShare

0为自身原始数据分片

1为接收对方数据的分片

0或1

输入

input

原始数据,当isRecvShare为0时矩阵input可以为null,当isRecvShare不为0时不能为null

目前支持double类型

输入

share

矩阵分片结果

类型为:DG_MpcMatShare

一级指针为空二级指针不为空

输出

表1 DG_TeeMatInput结构体

名称

类型

说明

data

DG_MpcDataUnion

输入数据strings的类型为DG_String *,doubleNumbers为double *, u64Numbers类型为u64 *

row

uint32_t

矩阵行数

col

uint32_t

矩阵列数

dataType

DG_MpcDataType

数据类型枚举有:

MPC_DOUBLE(密态矩阵加法、密态矩阵减法、密态矩阵乘法)

表2 DG_MpcDataUnion联合体

名称

类型

说明

strings

DG_String

字符串数组类型

u64Numbers

u64

u64数组

doubleNumbers

double

double数组

表3 DG_MpcMatShare结构体

名称

类型

说明

dataShare

Share

分片结构

row

unsigned long

矩阵行数

col

unsigned long

矩阵列数

shareType

DG_ShareType

分片类型

ShareType
enum DG_ShareType {
    FIX_POINT, // 定点数
    NON_FIX_POINT // 非定点数
};
表4 Share结构体

名称

类型

说明

shares

u64*

一个明文数据对应的多个分片

size

u64

分片个数

返回值

  • 成功:返回0。
  • 失败:返回错误码。

错误码

错误码

错误码值

描述

特殊说明

DG_FAILURE

4501

分片失败

参数校验失败

分片失败

接收对方数据失败

依赖

  • aritOpts依赖DG_InitMatrixOpts的成功初始化矩阵算术类函数组。
  • 需要先调用negotiateSeeds接口给所有节点分发种子。
  • 依赖的头文件为 #include "data_guard_mpc.h"。

示例

#include  "data_guard_mpc.h"
std::unique_ptr<double[]> inData = std::make_unique<double[]>(datas.size());
for (int i = 0; i < datas.size(); i++) {
    inData[i] = (std::stod(datas[i].c_str())) * 1.0;
}
// 计算方分片DG_TeeMatInput teeInput;
teeInput.data.doubleNumbers = inData.get();
teeInput.row = row; // 假设矩阵行数为row
teeInput.col = col; // 假设矩阵列数为col
teeInput.dataType = MPC_DOUBLE;
printf("++++++++++input data size:%lu\n", teeInput.size);
int res = aritOpts.negotiateSeeds(dgTee);
printf("exchange seed res = %d\n", res);
DG_MpcMatShareSet shareDat;
std::unique_ptr<DG_MpcMatShare[]> share = std::make_unique<DG_MpcMatShare[]>(2);
DG_MpcMatShare *share1 = nullptr;
DG_MpcMatShare *share2 = nullptr;
DG_TeeMatOutput *output = nullptr;
if (nodeId == 0) {
res = aritOpts.makeShare(dgTee, 1, nullptr, &share1);  // &teeInput

说明:样例只做参考,方便测试从文件中读取数据,并不能真正运行。

测试结果:res为0,share不为null。

  • 调用DG_InitMatrixOpts成功后的aritOpts来调用makeShare接口。
  • 在两个节点(0节点和1节点)中调用接口时,若某调用方返回非成功错误码,需要此调用方通过任务调度通知对端结束业务流程。例如,调用makeShare时1节点返回错误码,0节点在等待接收,此时需要调用方通知0节点停止接收。