如何在多处理中使用PyCuda?

时间:2017-10-24 07:32:54

标签: python cuda multiprocessing pycuda

问题不是在进程中使用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)]

错误如下:

  

文件&#34; test.py&#34;,第35行,在do_this_fft中cuda.init()LogicError:cuInit失败:初始化错误

我已经尝试过上下文,计划和推进过程,所有这些都没有后果。

2 个答案:

答案 0 :(得分:0)

我们无法在fork()之前初始化CUDA,因此我们需要生成一个新进程

答案 1 :(得分:0)

我有一个类似的问题,在启动子流程之前,通过在主流程上添加一行代码来解决该问题:

react-redux

来源:[https://stackoverflow.com/a/55812288/8664574]