所有多线程程序都在 GPU 上运行吗?

911*_*303 3 python multithreading gpu python-3.x

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()
Run Code Online (Sandbox Code Playgroud)

rpy2 用于通过 python 调用我的 R 代码。现在它使用 100 个线程。这个多线程进程是否使用GPU?我认为目前它正在CPU上运行。这可以从系统监视器中识别出来。但是如果我使用 1000 个线程,那么它使用 CPU 还是 GPU?

Bas*_*tch 5

所有多线程程序都在 GPU 上运行吗?

当然不是。有些计算机没有任何GPU(想象一下运行某些网站的数据中心内的 Linux 服务器,或者某些笔记本电脑)。即使在那些拥有 GPU 的计算机上,多线程程序也不会(神奇地)使用它,除非该程序是专门为该 GPU 编写的。例如,许多 Web 服务器或数据库服务器程序是多线程的,但不使用 GPU(并且无法使用它)。

具体来说,GPU 需要专门的代码来运行(这与CPU 上运行的机器代码不同;指令集不同!)。实际上,您需要使用OpenCLCUDASPIR编写代码才能在 GPU 上运行。而且编程模型不同(因此编写 OpenCL 或 CUDA内核很困难,并且设计利用 GPU 的软件并不总是可能的,并且可能需要数月甚至数年的开发工作)。只有少数几种问题(本质上是向量问题)和程序可以从 GPU 中获益(并且您将花费大量精力为其重写它们)。而且 OpenCL 或 CUDA 代码的可移植性不太好(当将应用程序从一个 GPU 移动到另一种 GPU 型号时,您需要重写其中的部分内容,或者以不同的方式对其进行调整)。

但是使用pthreads (在 Linux 上)的 C 代码可以(并且通常确实)在多个内核上运行(请注意处理器亲和性NUMA)。典型微处理器中的所有内核都具有相同的指令集架构,并且可以运行相同的机器代码。在Linux上,创建线程的系统调用是(在最低级别,在用户空间中)clone(2)(实际上它仅在pthreads(7)中直接使用)。实际上,您的进程中最好有很少的可运行线程(也许只有十几个)。线程相当“重”。

当然,多线程与Python没有太大关系(Python有一个GIL,这使得真正的Python多线程变得不可能)。

并行计算比你想象的要困难得多!程序的并行化从来都不是神奇的,需要大量的努力和技能。Numpy试图为您隐藏和抽象这种复杂性(例如,通过在 GPU 上内部运行用 OpenCL 或 CUDA 编写的代码),但这并不总是可能的。