原始题目:LeetGPU - 1D Convolution
编写一个 GPU 程序来执行一维卷积操作。给定输入数组和卷积核(滤波器),使用 "valid" 边界条件计算卷积输出——即卷积核仅在其与输入完全重叠的位置上应用。
输入包含两个数组:
input:32 位浮点数的一维数组。kernel:32 位浮点数的一维数组,表示卷积核。
输出数组的大小为 input_size−kernel_size+1。
卷积操作的数学定义为:
output[i]=j=0∑kernel_size−1input[i+j]⋅kernel[j]
其中 i 的取值范围为 0 到 input_size−kernel_size。
- 不允许使用外部库。
solve 函数签名必须保持不变。- 最终结果必须存储在
output 数组中。
Input: input = [1, 2, 3, 4, 5]
kernel = [1, 0, -1]
Output: [-2, -2, -2]
Input: input = [2, 4, 6, 8]
kernel = [0.5, 0.2]
Output: [1.8, 3.2, 4.6]
- 1≤input_size≤1,500,000。
- 1≤kernel_size≤2,047。
- kernel_size≤input_size。
- 性能测试在 input_size=1,500,000, kernel_size=2,047 的规模下进行。
一维卷积的每个输出元素需要读取 kernel_size 个输入元素。当 kernel_size 较大时,每个输入元素会被多个输出共享。可以使用共享内存来缓存输入元素,减少全局内存访问。对于较大的 kernel_size,可以使用常量内存(Constant Memory)存储卷积核以利用广播机制。欢迎在 GitHub Discussions 分享你的解法。