【SecretFlow——SPU进阶】

1. 姚氏百万富翁问题

除了三方协议ABY3之外,我们还可以通过配置cluster_def中的protocol更换不同的协议。

import spu
import secretflow as sf

sf.shutdown()
sf.init(['alice', 'bob', 'carol', 'dave'], address='local')
# 生成一个环境
cheetah_config = sf.utils.testing.cluster_def(
    parties=['alice', 'bob'],
    runtime_config={
        'protocol': spu.spu_pb2.CHEETAH,
        'field': spu.spu_pb2.FM64,
    },
)
# 创建一个基于alice和bob的SPU设备
spu_device2 = sf.SPU(cheetah_config)
# 获取carol的资产,只要最后可以返回一个值即可
def get_carol_assets():
    return 1000000
# 获取dave的资产,只要最后可以返回一个值即可
def get_dave_assets():
    return 1000002
# 创建两个PYU设备
carol, dave = sf.PYU('carol'), sf.PYU('dave')
# 生成两个PYUObject
carol_assets = carol(get_carol_assets)()
dave_assets = dave(get_dave_assets)()
# 设置比较函数
def get_winner(carol, dave):
    return carol > dave
# 将函数和相应的参数放入SPU设备执行
winner = spu_device2(get_winner)(carol_assets, dave_assets)
sf.reveal(winner)

2.从SPU计算得到多个返回值

在大多数情况下,我们从 SPU 设备执行的函数中获得多个返回值。
博主个人比较喜欢第二种

def get_multiple_outputs(x, y):
    return x + y, x - y
# 方式一:默认情况下会将其包装成元组的形式
# (array(2000002, dtype=int32), array(-2, dtype=int32))
single_output = spu_device2(get_multiple_outputs)(carol_assets, dave_assets)

# 方式二:指示 SPU 为我们根据编译结果决定返回值数量。(推荐这一种)
# 返回对象的列表
multiple_outputs = spu_device2(
    get_multiple_outputs, num_returns_policy=SPUCompilerNumReturnsPolicy.FROM_COMPILER
)(carol_assets, dave_assets)
# 方式三:手动确定返回值数量
user_multiple_outputs = spu_device2(
    get_multiple_outputs,
    num_returns_policy=SPUCompilerNumReturnsPolicy.FROM_USER,
    user_specified_num_returns=2,
)(carol_assets, dave_assets)

user_multiple_outputs

3. 总结一下

  • 默认情况下,SPU 将所有返回值视为单个返回值。
  • 由于 SPU 编译器生成 SPU 可执行文件,它可以计算出返回值数量。 但是,这个选项会导致一些延迟,因为我们必须使编译工作阻塞。
  • 如果您想避免延迟,我们可以手动提供返回值数量。 但是你必须确保你提供了正确的数字,否则程序会报错!

相关推荐

  1. CSS<span style='color:red;'>进</span><span style='color:red;'>阶</span>

    CSS

    2024-04-06 22:28:02      50 阅读
  2. C++:模板

    2024-04-06 22:28:02       47 阅读
  3. SQLMap使用

    2024-04-06 22:28:02       46 阅读
  4. Mybatis知识

    2024-04-06 22:28:02       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 22:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 22:28:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 22:28:02       82 阅读
  4. Python语言-面向对象

    2024-04-06 22:28:02       91 阅读

热门阅读

  1. 【00150】2024 金融理论与实务试卷一

    2024-04-06 22:28:02       36 阅读
  2. Windows安装SSH超详细教程

    2024-04-06 22:28:02       43 阅读
  3. 力扣-简化路径

    2024-04-06 22:28:02       35 阅读
  4. 【数据结构】顺序表与链表

    2024-04-06 22:28:02       32 阅读
  5. C#WPF更改窗体图标和生成exe文件的图标实例

    2024-04-06 22:28:02       36 阅读
  6. 【杂记】SQLAlchemy使用方法记录

    2024-04-06 22:28:02       37 阅读
  7. 在macOS系统上安装CERN ROOT数据分析框架

    2024-04-06 22:28:02       44 阅读
  8. 在Spring Boot中导入和解析XML文件的实践

    2024-04-06 22:28:02       35 阅读
  9. 偶然发现一个平均分布得不可思议的伪随机函数

    2024-04-06 22:28:02       37 阅读
  10. WebSocketServer后端配置,精简版

    2024-04-06 22:28:02       41 阅读
  11. C++ | vector模拟实现

    2024-04-06 22:28:02       27 阅读