Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 预编译numba cuda内核(非jit)_Python_Multiprocessing_Gpu_Jit_Numba - Fatal编程技术网

Python 预编译numba cuda内核(非jit)

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内核呢?我不想

您好,我正在使用numba编写一些带有
@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编译时,该线程也不会再有编译开销——对于后续启动,内核将从缓存中检索。如果您正在处理许多图像,编译时间在整个运行时将变得微不足道