原始题目:LeetGPU - 3D Convolution
编写一个 GPU 程序,执行三维卷积操作。给定三维输入体积和三维卷积核,使用 "valid" 边界条件(无填充)计算卷积输出。
对于三维卷积,位置 (i,j,k) 的输出为:
output(i,j,k)=d=0∑Kd−1r=0∑Kr−1c=0∑Kc−1input(i+d,j+r,k+c)⋅kernel(d,r,c)
所有数据(输入、卷积核、输出)均以一维数组表示,存储顺序为:先行列(row-major),再深度。
输出维度为:
output_depthoutput_rowsoutput_cols=input_depth−kernel_depth+1=input_rows−kernel_rows+1=input_cols−kernel_cols+1
- 不允许使用外部库。
solve 函数签名必须保持不变。- 最终结果必须存储在
output 中。
Input: 体积 V∈R^{3×3×3}:
V(d=0) = [[1,2,3],[4,5,6],[7,8,9]]
V(d=1) = [[10,11,12],[13,14,15],[16,17,18]]
V(d=2) = [[19,20,21],[22,23,24],[25,26,27]]
Kernel K∈R^{2×3×3}:
K(d=0) = [[1,0,0],[1,1,1],[0,0,0]]
K(d=1) = [[1,1,0],[1,1,0],[0,0,1]]
Output: O∈R^{2×1×1}: [82, 163]
Input: 体积 V∈R^{2×2×2}:
V(d=0) = [[1,2],[3,4]]
V(d=1) = [[5,6],[7,8]]
Kernel K∈R^{2×2×2} (全1)
Output: O∈R^{1×1×1}: [36]
- 1≤input_depth,input_rows,input_cols≤256。
- 1≤kernel_depth,kernel_rows,kernel_cols≤5。
- 卷积核各维度不超过输入对应维度。
- 性能测试在 input=128×128,kernel=5×5 的规模下进行。
三维卷积是二维卷积的自然扩展,常用于视频处理(3D CNN)和医学影像。计算量随核体积呈立方增长。共享内存分块策略在三维空间中更加关键——因为 Kd×Kr×Kc 个输入元素可能超过每个 SM 的共享内存限制,需要仔细规划分块大小。常量内存对小核(≤53=125 个参数)仍然有效。欢迎在 GitHub Discussions 分享你的解法。