No description
  • Cuda 87.9%
  • CMake 6.7%
  • C++ 5.4%
Find a file
2026-09-05 00:32:49 +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 standalone GPU TVA operators project 2026-08-21 10:39:44 +08:00
results Expand TVA operator performance breakdown 2026-09-05 00:32:49 +08:00
src Add standalone GPU TVA operators project 2026-08-21 10:39:44 +08:00
tests Add standalone GPU TVA operators project 2026-08-21 10:39:44 +08:00
.gitignore Add standalone GPU TVA operators project 2026-08-21 10:39:44 +08:00
CMakeLists.txt Add standalone GPU TVA operators project 2026-08-21 10:39:44 +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 Expand TVA operator performance breakdown 2026-09-05 00:32:49 +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 AND 本地项 replicated_3pc::AndBLocalAsync (x0&y0) ^ (x0&y1) ^ (x1&y0) ^ r
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);

以上接口只提交 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 条数据;两个 share 分量的 XOR、带随机 mask 的 AND 本地项、零长度调用

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

算子层性能评测

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

  • cpu_compute_ms:输入已在主机内存,只执行 CPU reference
  • gpu_kernel_ms:输入输出已在显存,只执行 CUDA kernel
  • gpu_e2e_ms:复用已分配设备 buffer计入 H2D、kernel 和 D2H
  • kernel_speedupe2e_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_msd2h_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,000Releasesm_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
  -> 收到相邻 party share 后组装下一状态

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

目录结构

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