import numpy as np
np.random.seed(1)
import rpy2.robjects as ro
import time
import threading
filename='your/filename'
path='specify/path'
output_location='specify/output/location'
def function1(arg1,arg2):
r=ro.r
r.source(path+"analysis.R") #invoking R program
p=r.analysis(arg1,arg2) #calling the R function
return p
threads=[]
for i in range(100):
t1=threading.Thread(target=function1,name='thread{}'.format(i),args=(arg1,arg2))
t1.start()
threads.append(t1)
print('{} has started \n'.format(t1.name))
for i in threads: # to know threads used
i.join()
rpy2用于通过python调用我的R代码。现在它使用100个线程。这个多进程处理过程是否使用GPU?我认为目前它正在CPU上运行,可以从系统监视器中识别出来。但是,如果我使用1000个线程,那么它使用CPU还是GPU?
答案 0 :(得分:2)
所有多线程程序是否都在GPU上运行?
当然不是。。某些计算机没有任何GPU(例如运行某些网站或某些笔记本电脑的数据中心内的Linux服务器)。甚至在拥有GPU的人中,多线程程序也不会(魔术地)使用它,除非该程序针对该GPU进行了特定的编码。例如,许多Web服务器或数据库服务器程序是多线程的,但不使用GPU(并且不能使用它)。
具体来说,GPU需要运行专门的代码(这与CPU上运行的machine code不同;指令集不同!)。实际上,您需要使用OpenCL或CUDA或SPIR编写代码,以便能够在GPU上运行。而且编程模型是不同的(因此,编写OpenCL或CUDA kernel很困难,并且设计软件以利用GPU的优势并非总是可行的,并且可能需要数月甚至数年的开发工作)。只有少数 类问题(本质上是矢量问题)和程序可以从GPU中获利(并且您将花费很多精力来为它们重写)。而且,OpenCL或CUDA代码不是非常可移植的(在将应用程序从一个GPU迁移到另一种GPU模式时,您需要重写它的一部分或对其进行不同的调整)。
但是使用pthreads(在Linux上)的C代码可以并且通常确实在多个内核上运行(请注意processor affinity和NUMA)。典型微处理器中的所有内核都具有相同的指令集架构,并且可以运行相同的机器代码。在Linux上,用于创建线程的system call是{最低级别的user space中的clone(2)(实际上,它仅直接用于pthreads(7)中)。在实践中,您的进程中最好有几个可运行线程(也许只有十二个)。线程非常“繁重”。
当然,多线程与Python并没有多大关系(它具有GIL使得真正的Python多线程成为不可能)。
Parallel computing比您想象的要难得多!程序的并行化从来都不是神奇的,它需要大量的努力和技能。 Numpy试图为您隐藏和abstract这种复杂性(例如,通过内部运行用OpenCL或GPU上的CUDA编写的代码),但这并不总是可能的。