🥑Numba映射Python代码至CUDA内核

Numba | Python | CUDA

GPU 架构对机器学习至关重要,而且似乎每天都变得更加重要。但是,您无需接触 GPU 代码即可成为机器学习专家。通过抽象工作很难获得直觉。

本文,以完全交互式的方式教授初学者 GPU 编程。 让您直接进入编码和构建 GPU 内核。 练习使用 NUMBA 直接将 Python 代码映射到 CUDA 内核。 它看起来像 Python,但与编写低级 CUDA 代码基本相同。

Numba编程CUDA GPU

内核实现(GPU 函数)示例

  1. 将向量 a 的每个位置加 10 并将其存储在向量输出中。 每个位置有 1 个线程。

    def map_spec(a):
        return a + 10
    
    def map_test(cuda):
        def call(out, a) -> None:
            local_i = cuda.threadIdx.x
            # FILL ME IN (roughly 1 lines)
    
        return call
    
    SIZE = 4
    out = np.zeros((SIZE,))
    a = np.arange(SIZE)
    problem = CudaProblem(
        "Map", map_test, [a], out, threadsperblock=Coord(SIZE, 1), spec=map_spec
    )
    problem.show()
  2. 将 a 和 b 的每个位置相加并将其存储在 out 中。每个位置有 1 个线程。

  3. 将 a 的每个位置加 10 并将其存储在 out 中。您的线程数多于位置数。

  4. 将 a 的每个位置加 10 并将其存储在 out 中。输入 a 是 2D 和正方形。您的线程数多于位置数。

  5. 添加 a 和 b 并将其存储在 out 中。输入 a 和 b 是向量。您的线程数多于位置数。

  6. 将 a 的每个位置加 10 并将其存储在 out 中。每个块的线程数少于 a 的大小。

  7. 在 2D 中实现相同的内核。在两个方向上,每个块的线程数都少于 a 的大小。

  8. 将 a 的每个位置加 10 并将其存储在 out 中。每个块的线程数少于 a 的大小。

  9. 将 a 的最后 3 个位置相加并将其存储在 out 中。每个位置有 1 个线程。每个线程只需要 1 次全局读取和 1 次全局写入。

  10. 计算 a 和 b 的点积并将其存储在 out 中。每个位置有 1 个线程。每个线程只需要 2 次全局读取和 1 次全局写入。

  11. 计算 a 和 b 之间的一维卷积并将其存储出来。您需要处理一般情况。每个线程只需要 2 次全局读取和 1 次全局写入。

  12. 计算 a 的总和并将其存储在 out 中。如果 a 的大小大于块大小,则只存储每个块的总和。

  13. 计算 a 的每一列的总和并将其存储在 out 中。

  14. 将方阵 a 和 b 相乘并将结果存储在 out 中的内核。

🏈指点迷津 | Brief

Last updated