如何在多处理中使用 PyCuda?
How use PyCuda in multiprocessing?
问题不是在进程中使用 CUDA,而是如果父级已经有一个初始化的 CUDA,那么在进程中就不能初始化它。如果你只是在父级中进行初始化并将其扔到进程中,但它不起作用。这是流程中的示例:
from pyfft.cuda import Plan
import numpy
import pycuda.driver as cuda
from pycuda.tools import make_default_context
import pycuda.gpuarray as gpuarray
from multiprocessing import Process
def do_this_fft(data):
cuda.init()
context = make_default_context()
stream = cuda.Stream()
plan = Plan((16, 16), stream=stream)
gpu_data = gpuarray.to_gpu(data)
plan.execute(gpu_data)
result = gpu_data.get()
del gpu_data
print(result)
context.pop()
del plan,stream,context
data = numpy.ones((16, 16), dtype=numpy.complex64)
process_list=[Process(target=do_this_fft,args=(data,)).start() for i in range(2)]
但是如果我们这样写代码,那就什么都行不通了
from pyfft.cuda import Plan
import numpy
import pycuda.driver as cuda
from pycuda.tools import make_default_context
import pycuda.gpuarray as gpuarray
from multiprocessing import Process
def start_cuda_and_fft(data):
cuda.init()
context = make_default_context()
stream = cuda.Stream()
plan = Plan((16,16), stream=stream)
context.pop()
del plan,stream,context
process_list=[Process(target=do_this_fft,args=(data,plan)).start() for i in range(2)]
def do_this_fft(data):
cuda.init() #<---------------Error
'''
File "test.py", line 35, in do_this_fft
cuda.init()
LogicError: cuInit failed: initialization error
'''
context = make_default_context()
stream = cuda.Stream()
plan = Plan((16, 16), stream=stream)
gpu_data = gpuarray.to_gpu(data)
plan.execute(gpu_data)
result = gpu_data.get()
context.pop()
del plan,stream,context
print(result)
data = numpy.ones((16, 16), dtype=numpy.complex64)
process_list=[Process(target=do_this_fft,args=(data,)).start() for i in range(2)]
错误如下:
File "test.py", line 35, in do_this_fft cuda.init() LogicError: cuInit failed: initialization error
我已经尝试过做背景、计划并推进流程,所有这些都没有后果。
我们无法在 fork() 之前初始化 CUDA,因此我们需要生成一个新进程
我有一个类似的问题,通过在启动子进程之前在主进程上添加一行代码来解决它:
multiprocessing.set_start_method('spawn')
来源:[
问题不是在进程中使用 CUDA,而是如果父级已经有一个初始化的 CUDA,那么在进程中就不能初始化它。如果你只是在父级中进行初始化并将其扔到进程中,但它不起作用。这是流程中的示例:
from pyfft.cuda import Plan
import numpy
import pycuda.driver as cuda
from pycuda.tools import make_default_context
import pycuda.gpuarray as gpuarray
from multiprocessing import Process
def do_this_fft(data):
cuda.init()
context = make_default_context()
stream = cuda.Stream()
plan = Plan((16, 16), stream=stream)
gpu_data = gpuarray.to_gpu(data)
plan.execute(gpu_data)
result = gpu_data.get()
del gpu_data
print(result)
context.pop()
del plan,stream,context
data = numpy.ones((16, 16), dtype=numpy.complex64)
process_list=[Process(target=do_this_fft,args=(data,)).start() for i in range(2)]
但是如果我们这样写代码,那就什么都行不通了
from pyfft.cuda import Plan
import numpy
import pycuda.driver as cuda
from pycuda.tools import make_default_context
import pycuda.gpuarray as gpuarray
from multiprocessing import Process
def start_cuda_and_fft(data):
cuda.init()
context = make_default_context()
stream = cuda.Stream()
plan = Plan((16,16), stream=stream)
context.pop()
del plan,stream,context
process_list=[Process(target=do_this_fft,args=(data,plan)).start() for i in range(2)]
def do_this_fft(data):
cuda.init() #<---------------Error
'''
File "test.py", line 35, in do_this_fft
cuda.init()
LogicError: cuInit failed: initialization error
'''
context = make_default_context()
stream = cuda.Stream()
plan = Plan((16, 16), stream=stream)
gpu_data = gpuarray.to_gpu(data)
plan.execute(gpu_data)
result = gpu_data.get()
context.pop()
del plan,stream,context
print(result)
data = numpy.ones((16, 16), dtype=numpy.complex64)
process_list=[Process(target=do_this_fft,args=(data,)).start() for i in range(2)]
错误如下:
File "test.py", line 35, in do_this_fft cuda.init() LogicError: cuInit failed: initialization error
我已经尝试过做背景、计划并推进流程,所有这些都没有后果。
我们无法在 fork() 之前初始化 CUDA,因此我们需要生成一个新进程
我有一个类似的问题,通过在启动子进程之前在主进程上添加一行代码来解决它:
multiprocessing.set_start_method('spawn')
来源:[