使用multiprocessing为什么会触发GPU计算
写了一个字符画视频程序,他只能在五六帧的情况下才能和原视频同步:
import cv2
cap = cv2.VideoCapture('badapple.mp4')
for i in range(0,int(cap.get(cv2.CAP_PROP_FRAME_COUNT)),12):
cap.set(cv2.CAP_PROP_POS_FRAMES,i)
image = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY)
pixel_string = ''
for y in range(0,1080,60):
for x in range(0,1440,30):
gray_value = image[y][x]
if gray_value<154:
pixel_string += ' '
else:
pixel_string += '8'
pixel_string += '\n'
print(pixel_string)
cap.release()
没有怀着太大希望写了一个进程池,因为运行时CPU利用率已经达到100%,频率接近极限。
import multiprocessing
import cv2
def convert_character_drowing(a,image):
pixel_string = ''
for y in range(0,1080,40):
for x in range(0,1440,20):
gray_value = image[y][x]
if gray_value<52:
pixel_string += ' '
elif gray_value<103:
pixel_string += '1'
elif gray_value<154:
pixel_string += '7'
elif gray_value<215:
pixel_string += '2'
else:
pixel_string += '8'
pixel_string += '\n'
print(pixel_string)
if __name__ == '__main__':
cap = cv2.VideoCapture('badapple.mp4')
pool = multiprocessing.Pool(processes=4)
for i in range(0,int(cap.get(cv2.CAP_PROP_FRAME_COUNT))):
image = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY)
pool.apply_async(convert_character_drowing, args=(i,image))
pool.close()
pool.join()
但帧数直线上升,甚至比原视频快,这一看才发现GPU使用率也抬到80%
查阅了很多资料也没有说multiprocessing会占用GPU,不知到底是什么原因触发了GPU的工作,(况且进程池的进程数量没有超过cpu内核数量)如果这是电脑特性的话,那在第一段代码执行时也应该使用GPU啊。
麻烦解释GPU被触发的原因?
附上CPU\GPU的型号
'''CPU
Intel(R) Celeron(R) N5095 @ 2.00GHz
基准速度: 2.00 GHz
插槽: 1
内核: 4
逻辑处理器: 4
虚拟化: 已启用
GPU 0
Intel(R) UHD Graphics
驱动程序版本: 31.0.101.1999
驱动程序日期: 2022/5/31
DirectX 版本: 12 (FL 12.1)
物理位置: PCI 总线 0、设备 2、功能 0
专用 GPU 内存
共享 GPU 内存 0.3/5.9 GB
GPU 内存 0.3/5.9 GB'''
你用的是 Intel 的集成显卡,并且代码里也没有明确的 GPU 计算库(例如 CUDA 或 OpenCL)。那么你看到的 GPU 使用率上升可能并不是因为你的程序直接在 GPU 上运行计算。
可能的是操作系统或驱动程序的自动优化。一些操作系统和图形驱动程序可以自动将某些图像处理任务(比如解码视频,缩放图像等)"卸载" 到 GPU 上,以减轻 CPU 的负担。而且这种优化是透明的,也就是说你的程序并不需要知道这一点,也不要做任何特殊的编程来利用这个功能。
在你的例子中,用 multiprocessing 创建了多个进程,并行读取和处理视频帧。这可能会导致操作系统和驱动程序把更多的图像处理任务自动卸载到 GPU 上,从而提高 GPU 的使用率。
这并不是所有的系统都有的特性。在某些系统上,相同的程序可能只会使用 CPU,而不会利用 GPU。这也解释了为什么在第一段代码执行时并未使用到 GPU。
如果你想在代码中明确地使用 GPU 进行计算,你要用支持 GPU 计算的库,例如 CUDA(适用于 Nvidia 的显卡),OpenCL(一个跨平台的并行计算库),或者像 TensorFlow 和 PyTorch 这样的深度学习库。
Intel 的集成显卡性能相较于独立显卡(如 Nvidia 或 AMD 的显卡)可能有所不足,可能无法在某些复杂或需要高性能计算的任务中有效利用。