暂无描述
  • Cuda 90.5%
  • CMake 5%
  • C++ 4.5%
查找文件
仓库文件(优先显示最新提交)
文件名 最新提交消息 最新提交日期
2026-10-18 11:53:55 +08:00
benchmarks Expand TVA operator performance breakdown 2026-09-05 00:32:49 +08:00
cmake Add standalone GPU TVA operators project 2026-08-21 10:39:44 +08:00
include/gpu_tva Add Boolean RSS operators and tests 2026-10-18 11:53:55 +08:00
results Add Boolean RSS operators and tests 2026-10-18 11:53:55 +08:00
src Add Boolean RSS operators and tests 2026-10-18 11:53:55 +08:00
tests Add Boolean RSS operators and tests 2026-10-18 11:53:55 +08:00
.gitignore Add Boolean RSS operators and tests 2026-10-18 11:53:55 +08:00
CMakeLists.txt Add Boolean RSS operators and tests 2026-10-18 11:53:55 +08:00
LICENSE Add standalone GPU TVA operators project 2026-08-21 10:39:44 +08:00
NOTICE Add standalone GPU TVA operators project 2026-08-21 10:39:44 +08:00
README.md Add Boolean RSS operators and tests 2026-10-18 11:53:55 +08:00

GPU_TVA

GPU_TVA 是面向三方 replicated secret sharing 的独立 CUDA 算子库。项目提供可直接构建、测试和评测的 GPU 本地计算接口,不依赖 MPI、libsodium 或服务层。

当前范围

模块 GPU 接口 计算语义
int32 批量比较 CompareI32Async 同时输出 >、<、==、!= 四个明文 bit 向量
host 比较适配 CompareI32Host 包含设备分配、H2D、kernel 和 D2H 的便捷接口
replicated boolean XOR replicated_3pc::XorBAsync 每个 party 持有的两个 share 分量分别执行 XOR
replicated boolean NOT replicated_3pc::NotBAsync 对每个 party 的两个 share 分量执行补码,保持 replicated share 重叠关系
replicated boolean AND 本地项 replicated_3pc::AndBLocalAsync (x0&y0) ^ (x0&y1) ^ (x1&y0) ^ r
replicated boolean AND 组装 replicated_3pc::AndBAssembleAsync 将交换回来的相邻 party 项与本地项组成新的 share pair
CPU reference gpu_tva::reference::* 与三个 GPU 算子逐项对齐的 CPU 实现

安全模型说明

  • CompareI32Async 是用于验证 CUDA 比较吞吐和连续 int32 数据布局的明文算子,不是三方安全比较协议。
  • AndBLocalAsync 只覆盖 replicated boolean AND 生成待交换 share 之前的本地计算;随机 mask 的协商和跨 party 通信仍由协议层负责。
  • 完整的 BSharedVector 比较需要组合 XOR、AND、shift、not 等多轮布尔 share 操作。本仓库不把单个 kernel 的数字表述为完整协议性能。

环境要求

  • Linux 或 WSL2;
  • 支持 CUDA 的 NVIDIA GPU;
  • CUDA Toolkit 12.x 或 13.x;
  • CMake 3.22 及以上;
  • 支持 C++17/CUDA C++17 的主机编译器。

部署、构建与测试

git clone git@github.com:YY404NF/GPU_TVA.git
cd GPU_TVA

cmake -S . -B build-release \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_CXX_COMPILER=/usr/bin/g++-13 \
  -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/g++-13 \
  -DCMAKE_CUDA_ARCHITECTURES=86

cmake --build build-release -j 4
ctest --test-dir build-release --output-on-failure

CMAKE_CUDA_ARCHITECTURES=86 对应 RTX 30 系列;其他 GPU 应改为对应的 compute capability,也可以省略该参数让 CMake 自动选择。

运行算子层 CPU/GPU benchmark:

./build-release/gpu_tva_operator_benchmark

安装静态库、头文件和 CMake target:

cmake --install build-release --prefix "$PWD/install"

在其他 CMake 项目中直接引用源码目录:

add_subdirectory(path/to/GPU_TVA)
target_link_libraries(your_cuda_target PRIVATE GPU_TVA::gpu_tva)

也可以使用安装后的 package:

find_package(GPU_TVA CONFIG REQUIRED)
target_link_libraries(your_cuda_target PRIVATE GPU_TVA::gpu_tva)

接口示例

输入和输出已经常驻 GPU 时,可以直接调用异步接口:

#include <gpu_tva/comparison.cuh>
#include <gpu_tva/replicated_3pc.cuh>

gpu_tva::CompareI32Async(
    d_x, d_y, d_gt, d_lt, d_eq, d_ne, count, stream);

gpu_tva::replicated_3pc::XorBAsync(
    d_x0, d_x1, d_y0, d_y1, d_z0, d_z1, count, stream);

gpu_tva::replicated_3pc::AndBLocalAsync(
    d_x0, d_x1, d_y0, d_y1, d_random_mask, d_local, count, stream);

gpu_tva::replicated_3pc::AndBAssembleAsync(
    d_received, d_local, d_z0, d_z1, count, stream);

以上接口只提交 kernel,不主动同步。调用方可以用同一 CUDA stream 串联后续计算,或在需要通信前使用 CUDA event/stream synchronization。

测试用例

CTest 覆盖内容
gpu_tva_comparison_test 1/17/1024/65537 条数据;正负数、相等、INT32_MIN/MAX、四类比较、host adapter、零长度调用
gpu_tva_replicated_3pc_test 1/17/1024/65537 条数据;XOR、NOT、带随机 mask 的 AND 本地项、AND 组装、零长度调用
gpu_tva_nemo_boolean_test 2/4/8/16 个 predicate bitmap;线性与平衡 AND 树;GPU local、D2H、模拟收到 share 的 H2D、组装和重构校验

测试不使用 assert 承担结果判断,因此 Release 构建同样会逐项检查 CPU/GPU 输出。

算子层性能评测

评测程序对三个算子分别报告:

  • cpu_compute_ms:输入已在主机内存,只执行 CPU reference;
  • gpu_kernel_ms:输入输出已在显存,只执行 CUDA kernel;
  • gpu_e2e_ms:复用已分配设备 buffer,计入 H2D、kernel 和 D2H;
  • kernel_speedup 与 e2e_speedup:分别以 CPU compute 除以上述两种 GPU 时间。

设备分配、输入生成、share 生成、跨 party 通信和结果 open 不计入表中。原始 CSV 保存在 results/。

测试环境:AMD Ryzen 7 5800H、NVIDIA GeForce RTX 3070 Laptop GPU 8 GiB、CUDA 13.3、GCC 13.3、Release、sm_86。CPU reference 固定在一个逻辑核;每个字段取同一进程内三组测量的中位数。

数据量为 100 万时,三个算子的结果如下:

算子 CPU compute (ms) GPU kernel (ms) kernel 加速比 GPU E2E (ms) E2E 加速比
四类 int32 比较 2.725 0.039 69.27x 3.034 0.90x
xor_b 1.314 0.070 18.87x 5.275 0.25x
and_b local 0.828 0.067 12.34x 5.132 0.16x

比较算子的规模趋势:

数据量 CPU compute (ms) GPU kernel (ms) kernel 加速比 GPU E2E (ms)
1,000 0.002 0.011 0.23x 0.357
10,000 0.025 0.008 3.00x 0.449
100,000 0.277 0.010 26.74x 0.778
1,000,000 2.725 0.039 69.27x 3.034

结果说明 GPU 的收益来自大批量、设备常驻的向量计算。若每个算子都单独上传全部 share 并回传结果,PCIe 传输会抵消 kernel 收益;接入完整协议时,应连续执行多个 GPU 算子,并只在需要通信时批量传输。完整 CSV 见 results/2026-08-15_rtx3070_laptop.csv。

分项计时与基本操作单项测试

为对齐 GPABE 的计时方式,gpu_tva_operator_benchmark 现在同时输出两段 CSV:算子汇总行和基本操作单项测试行。算子汇总字段含义如下:

  • gpu_alloc_ms:一次调用所需 device buffer 的 cudaMalloc 时间,不含释放时间;
  • h2d_ms、d2h_ms:复用已分配 buffer 时的输入上传和结果回传时间;
  • gpu_kernel_ms:输入、输出已在显存时的 kernel 时间;
  • gpu_sync_ms:前序工作已完成后的空闲 cudaDeviceSynchronize 基线,用于记录同步调用本身的固定成本;
  • gpu_resident_ms:复用 buffer 的 H2D、kernel、D2H 调用时间;
  • gpu_fresh_e2e_ms:每轮重新分配 buffer,并完成分配、H2D、kernel、D2H 和释放的完整调用时间。

基本操作单项测试行给出单个比较、XOR 或 AND 的 kernel 耗时,再乘以完整算子中每条数据的理论调用次数。full_over_cumulative 只是完整 kernel 实测值与基本操作累计值的比值,不能解释为协议加速比;差异还包含并行调度、全局内存访问、指令流水和 kernel launch。

本次运行(RTX 3070 Laptop,数据量为 1,000,000,Release,sm_86)的摘要:

算子 kernel (ms) resident (ms) fresh-E2E (ms) 分配 (ms) H2D (ms) D2H (ms)
compare_i32_x4 0.033 2.854 5.774 1.531 1.423 1.139
xor_b 0.073 6.257 9.238 2.457 3.200 1.528
and_b_local 0.060 5.028 11.016 3.188 4.643 0.737

这些时间只覆盖 TVA 本地算子,不包括 share 生成、网络通信、结果 open 或完整 SSE 查询。基本操作计数用于比较 kernel 内部开销,不能替代 Waldo/TVA 协议层测试。

原始数据见 results/2026-08-29_rtx3070_breakdown.csv。

协议层分工

这些接口只替换协议中的本地向量计算,不负责跨参与方通信:

每个参与方持有的两个本地 share 分量
  -> 连续 device buffer
  -> XorBAsync / AndBLocalAsync
  -> 协议层交换 outgoing share
  -> AndBAssembleAsync 组装下一状态

CompareI32Async 可以用于明文比较的 GPU 基线和数据布局验证,不能直接替换安全共享比较协议。

gpu_tva_nemo_boolean_test 用三方 replicated Boolean share 在单机 GPU 上模拟每一轮消息交换:local 项完成后取回到主机,再上传相邻 party 的 received 项,随后在 GPU 上组装。测试验证了 NEMO 多谓词合取的线性树与平衡树层数,计时包含模拟交换步骤,不代表真实网络延迟。

目录结构

include/gpu_tva/   公共 CUDA 接口和 CPU reference
src/               CUDA kernel 实现
tests/             CTest 正确性测试
benchmarks/        CPU/GPU 算子性能测试
results/           README 使用的原始测试结果