有没有办法在调用之前编译(即缓存)一个 cupy RawKernel?
Is there a way of compiling (i.e. caching) a cupy RawKernel before calling it?
我正在编写一个处理大量图像的 python 应用程序。
应用程序的计算速度很重要,因此我试图通过编写 cupy 内核来最小化执行时间。
为了简单起见,假设我下面有一个 cupy 原始内核。
import cupy as cp
add_kernel = cp.RawKernel(r'''
extern "C" __global__
void add_one(float* dimg, float* y) {
int j = threadIdx.x;
int i = blockIdx.x;
int k = blockDim.x;
int tid = k*i+j;
y[tid] = dimg[tid] + 1;
}
''', 'add_one')
if __name__ == '__main__':
h, w = 192, 256
dimg_cp = cp.zeros(shape=(h, w), dtype=cp.float32)
y = cp.zeros(shape=(h, w), dtype=cp.float32)
add_kernel((h,), (w,), (dimg_cp, y))
print(y)
在这里,'add_kernel' 只是复制一个输入矩阵,然后将复制矩阵的每个元素加一,然后 return 它。它工作得很好,但我相信代码可以在执行速度方面进一步优化。
根据link,当内核第一次被调用时(即没有缓存),编译会有开销。
我想避开这个编译时间。
所以想请问有没有办法在第一次调用内核之前编译cp.RawKernel?
提前致谢。
目前没有明确的方法来预编译内核而不调用它。一个简单的解决方案就是用一个小的输入调用它一次。请注意,编译后的内核也会缓存到文件中,因此开销仅存在于环境中脚本的第一次执行时。
我正在编写一个处理大量图像的 python 应用程序。 应用程序的计算速度很重要,因此我试图通过编写 cupy 内核来最小化执行时间。
为了简单起见,假设我下面有一个 cupy 原始内核。
import cupy as cp
add_kernel = cp.RawKernel(r'''
extern "C" __global__
void add_one(float* dimg, float* y) {
int j = threadIdx.x;
int i = blockIdx.x;
int k = blockDim.x;
int tid = k*i+j;
y[tid] = dimg[tid] + 1;
}
''', 'add_one')
if __name__ == '__main__':
h, w = 192, 256
dimg_cp = cp.zeros(shape=(h, w), dtype=cp.float32)
y = cp.zeros(shape=(h, w), dtype=cp.float32)
add_kernel((h,), (w,), (dimg_cp, y))
print(y)
在这里,'add_kernel' 只是复制一个输入矩阵,然后将复制矩阵的每个元素加一,然后 return 它。它工作得很好,但我相信代码可以在执行速度方面进一步优化。
根据link,当内核第一次被调用时(即没有缓存),编译会有开销。
我想避开这个编译时间。 所以想请问有没有办法在第一次调用内核之前编译cp.RawKernel?
提前致谢。
目前没有明确的方法来预编译内核而不调用它。一个简单的解决方案就是用一个小的输入调用它一次。请注意,编译后的内核也会缓存到文件中,因此开销仅存在于环境中脚本的第一次执行时。