我正在使用Python开发一个相当大的项目,该项目需要将一个计算密集型后台任务卸载到另一个核心,这样主服务就不会变慢.当multiprocessing.Queue用于传递工作进程的结果时,我遇到了一些显然很奇怪的行为.为a threading.Thread和a 使用相同的队列进行multiprocessing.Process比较,线程工作得很好但是在将大项放入队列后进程无法加入.注意:
import threading
import multiprocessing
class WorkerThread(threading.Thread):
def __init__(self, queue, size):
threading.Thread.__init__(self)
self.queue = queue
self.size = size
def run(self):
self.queue.put(range(size))
class WorkerProcess(multiprocessing.Process):
def __init__(self, queue, size):
multiprocessing.Process.__init__(self)
self.queue = queue
self.size = size
def run(self):
self.queue.put(range(size))
if __name__ == "__main__":
size = 100000
queue = multiprocessing.Queue()
worker_t = WorkerThread(queue, size)
worker_p = WorkerProcess(queue, size)
worker_t.start()
worker_t.join()
print 'thread results length:', len(queue.get())
worker_p.start()
worker_p.join()
print 'process results length:', len(queue.get())
Run Code Online (Sandbox Code Playgroud)
我已经看到了,这工作得很好size = 10000 …
我有一个应用程序,我希望在多个进程之间共享一个GPU.也就是说,这些进程中的每一个都会创建自己的CUDA或OpenCL上下文,目标是相同的GPU.根据Fermi白皮书[1],应用程序级上下文切换小于25微秒,但是在GPU上启动时启动有效地序列化 - 因此Fermi不能很好地完成这项工作.根据Kepler白皮书[2],有一种叫做Hyper-Q的东西允许来自多个CUDA流,MPI进程或进程内线程的多达32个同时连接.
我的问题:是否有人在Kepler GPU上尝试过此操作并验证其内核是否在从不同进程调度时同时运行?这只是一个CUDA功能,还是可以在Nvidia GPU上与OpenCL一起使用?AMD的GPU是否支持类似的东西?
[2] http://www.nvidia.com/content/PDF/kepler/NVIDIA-Kepler-GK110-Architecture-Whitepaper.pdf