有没有办法在调用之前编译(即缓存)cupy RawKernel?

Posted

技术标签:

【中文标题】有没有办法在调用之前编译(即缓存)cupy RawKernel?【英文标题】:Is there a way of compiling (i.e. caching) a cupy RawKernel before calling it? 【发布时间】:2019-05-26 21:49:57 【问题描述】:

我正在编写一个处理大量图像的 python 应用程序。 应用程序的计算速度很重要,因此我试图通过编写 Cupy 内核来最小化执行时间。

为了简单起见,假设我下面有一个cupy raw kernel。

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' 只是简单地复制一个输入矩阵并将复制矩阵的每个元素加一,然后返回它。它工作得很好,但我相信代码可以在执行速度方面进一步优化。

根据link,第一次调用内核时(即不缓存),编译会有开销。

我想避免这个编译时间。 所以想问问有没有办法在第一次调用内核之前编译cp.RawKernel?

提前致谢。

【问题讨论】:

【参考方案1】:

目前没有明确的方法来预编译内核而不调用它。一个简单的解决方案是只用少量输入调用它一次。请注意,编译后的内核也会缓存到文件中,因此开销只存在于环境中第一次执行脚本时。

【讨论】:

您好,感谢您的回答。是的,我找到了 'cp.cuda.compiler.compile_with_cache()' (它不使用内核,而是使用字符串模板)并使用它来预编译它。感谢您的澄清。

以上是关于有没有办法在调用之前编译(即缓存)cupy RawKernel?的主要内容,如果未能解决你的问题,请参考以下文章

Chainer 模块“cupy.cudnn”没有属性“softmax_forward”

如何停止在 ngOnInit() 之前调用的 ngOnChanges

我可以从c ++调用用cupy代码编写的cuda代码吗?

有没有办法从静态方法访问缓存或会话?

在会话自动销毁之前调用自定义方法

有没有办法以编程方式清除所有缓存文件?