Python 预编译numba cuda内核(非jit)
您好,我正在使用numba编写一些带有Python 预编译numba cuda内核(非jit),python,multiprocessing,gpu,jit,numba,Python,Multiprocessing,Gpu,Jit,Numba,您好,我正在使用numba编写一些带有@cuda.jit装饰器的内核。我有8个CPU线程,每个线程在2个GPU设备中的1个上调用一个内核。(cpu\u idx%len(cuda.gpus)具体说明) 我相信每个CPU线程都在编译内核,相对于内核处理整个映像所需的时间,这会占用很多时间。理想情况下,它应该只编译一次,以便所有CPU线程使用。但是在使用multiprocessing.Pool之前,我不能初始化任何cuda gpu代码,因为cuda不喜欢这样 那么有没有办法预编译cuda内核呢?我不想
@cuda.jit
装饰器的内核。我有8个CPU线程,每个线程在2个GPU设备中的1个上调用一个内核。(cpu\u idx%len(cuda.gpus)
具体说明)
我相信每个CPU线程都在编译内核,相对于内核处理整个映像所需的时间,这会占用很多时间。理想情况下,它应该只编译一次,以便所有CPU线程使用。但是在使用multiprocessing.Pool
之前,我不能初始化任何cuda gpu代码,因为cuda不喜欢这样
那么有没有办法预编译cuda内核呢?我不想要即时编译您可以使用即时编译为给定签名预编译CUDA内核: 请注意,CUDA后端只支持一个用于急切编译的签名(而CPU目标支持多个签名),并且在调用内核时,急切编译的内核不会检查类型。这将导致更快的启动,但允许参数类型在编译后的内核和传入的内核之间不匹配,从而增加了未被注意到的用户错误的可能性 然而,从您的问题中注意到,您使用的是多个进程而不是线程,您仍然会遇到一个问题,因为您必须先预编译,然后再进行fork,这是CUDA仍然不喜欢的。您是否可以在应用程序中使用线程来代替
附带问题:如果应用程序/GPU内核的运行时间很短,编译时间是主要因素,那么使用GPU对应用程序有意义吗?一旦您在每个线程中处理了一个映像,即使在JIT编译时,该线程也不会再有编译开销——对于后续启动,内核将从缓存中检索。如果您正在处理许多图像,编译时间在整个运行时将变得微不足道。您可以使用渴望编译来预编译给定签名的CUDA内核: 请注意,CUDA后端只支持一个用于急切编译的签名(而CPU目标支持多个签名),并且在调用内核时,急切编译的内核不会检查类型。这将导致更快的启动,但允许参数类型在编译后的内核和传入的内核之间不匹配,从而增加了未被注意到的用户错误的可能性 然而,从您的问题中注意到,您使用的是多个进程而不是线程,您仍然会遇到一个问题,因为您必须先预编译,然后再进行fork,这是CUDA仍然不喜欢的。您是否可以在应用程序中使用线程来代替 附带问题:如果应用程序/GPU内核的运行时间很短,编译时间是主要因素,那么使用GPU对应用程序有意义吗?一旦您在每个线程中处理了一个映像,即使在JIT编译时,该线程也不会再有编译开销——对于后续启动,内核将从缓存中检索。如果您正在处理许多图像,编译时间在整个运行时将变得微不足道