- Cuda 87.9%
- CMake 6.7%
- C++ 5.4%
| benchmarks | ||
| cmake | ||
| include/gpu_tva | ||
| results | ||
| src | ||
| tests | ||
| .gitignore | ||
| CMakeLists.txt | ||
| LICENSE | ||
| NOTICE | ||
| README.md | ||
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_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
-> 收到相邻 party share 后组装下一状态
CompareI32Async 可以用于明文比较的 GPU 基线和数据布局验证,不能直接替换安全共享比较协议。
目录结构
include/gpu_tva/ 公共 CUDA 接口和 CPU reference
src/ CUDA kernel 实现
tests/ CTest 正确性测试
benchmarks/ CPU/GPU 算子性能测试
results/ README 使用的原始测试结果