CuPy - 多个函数是否会导致多个内核?
CuPy - Does multiple functions result in multiple kernels?
我最近制作了一个 CuPy
版本的 numpy
代码,我只得到了 x5-x15 的改进因子。当我检查我的 GPU 使用率时,它似乎很低 (<1%)。我想优化我的代码运行方式以获得更快的结果。
一般来说,我想对 cupy. ndarray
进行多次连续的 CuPy
操作。
例如生成一个随机向量:
def randomUniformUnitary(N):
theta = cp.random.rand(N) * 2 * cp.pi
phi = cp.random.rand(N) * cp.pi
x = cp.sin(phi) * cp.cos(theta)
y = cp.sin(phi) * cp.sin(theta)
z = cp.cos(phi)
output = cp.stack((x, y, z), axis=-1)
return output
我有多个问题 the docs 似乎没有回答。 (他们确实说了即时内核创建,但没有解释)
- 内核合并?
CuPy 是否为 rand()
创建一个内核,然后发回数据并为 2
的乘法创建一个内核,然后...或者将所有这些计算组合成一个更快的内核?
- 内核组合标准?
如果是这样,导致这种行为的标准是什么?一线操作?相同的 array
操作?函数操作? def
在数组上仅使用一个 cupy
操作来分离函数在性能方面是否可以,或者在某些地方重复编写代码并将所有 cupy 函数放入一个 Python函数?
- 自己的内核?
如果每次计算都是分开做的,没有“内核合并”,那我觉得我应该自己做内核来优化?它是实现GPU优化的唯一途径吗?
一般来说,cupy 不会创建包含单独程序语句行为的单个内核。没有自动融合。 cupy 有一个 fuse function 适用于用户定义的内核(见下文)
见第 1 项
是的,您可以创建自己的内核。 cupy 提供了多种方法供你创建user-defined kernels,这是将多个操作组合成单个底层内核调用的另一种可能方法。
您应该能够使用 GPU 分析器(或检查,因为 cupy 是开源的)进一步表征上述 statements/behavior。
我最近制作了一个 CuPy
版本的 numpy
代码,我只得到了 x5-x15 的改进因子。当我检查我的 GPU 使用率时,它似乎很低 (<1%)。我想优化我的代码运行方式以获得更快的结果。
一般来说,我想对 cupy. ndarray
进行多次连续的 CuPy
操作。
例如生成一个随机向量:
def randomUniformUnitary(N):
theta = cp.random.rand(N) * 2 * cp.pi
phi = cp.random.rand(N) * cp.pi
x = cp.sin(phi) * cp.cos(theta)
y = cp.sin(phi) * cp.sin(theta)
z = cp.cos(phi)
output = cp.stack((x, y, z), axis=-1)
return output
我有多个问题 the docs 似乎没有回答。 (他们确实说了即时内核创建,但没有解释)
- 内核合并?
CuPy 是否为 rand()
创建一个内核,然后发回数据并为 2
的乘法创建一个内核,然后...或者将所有这些计算组合成一个更快的内核?
- 内核组合标准?
如果是这样,导致这种行为的标准是什么?一线操作?相同的 array
操作?函数操作? def
在数组上仅使用一个 cupy
操作来分离函数在性能方面是否可以,或者在某些地方重复编写代码并将所有 cupy 函数放入一个 Python函数?
- 自己的内核?
如果每次计算都是分开做的,没有“内核合并”,那我觉得我应该自己做内核来优化?它是实现GPU优化的唯一途径吗?
一般来说,cupy 不会创建包含单独程序语句行为的单个内核。没有自动融合。 cupy 有一个 fuse function 适用于用户定义的内核(见下文)
见第 1 项
是的,您可以创建自己的内核。 cupy 提供了多种方法供你创建user-defined kernels,这是将多个操作组合成单个底层内核调用的另一种可能方法。
您应该能够使用 GPU 分析器(或检查,因为 cupy 是开源的)进一步表征上述 statements/behavior。