Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 简单CPU/GPU上的最大并行进程数_Python_Parallel Processing_Gpu_Pyopencl_Particle Filter - Fatal编程技术网

Python 简单CPU/GPU上的最大并行进程数

Python 简单CPU/GPU上的最大并行进程数,python,parallel-processing,gpu,pyopencl,particle-filter,Python,Parallel Processing,Gpu,Pyopencl,Particle Filter,我试着用3000个独立的粒子来运行一个。更具体地说,我希望同时并行运行3000次(简单)计算,以便计算时间保持较短 此任务是为实验室设备上的实验应用而设计的,因此必须在本地笔记本电脑上运行。我不能依赖一个遥远的计算机集群,而且将要使用的计算机不太可能有精美的Nvidia图形卡。例如,我目前使用的计算机有一个Intel Core i7-8650U CPU和一个Intel UHD Graphics 620 GPU 使用multiprocessingPython库中的mp.cpu\u count()告

我试着用3000个独立的粒子来运行一个。更具体地说,我希望同时并行运行3000次(简单)计算,以便计算时间保持较短

此任务是为实验室设备上的实验应用而设计的,因此必须在本地笔记本电脑上运行。我不能依赖一个遥远的计算机集群,而且将要使用的计算机不太可能有精美的Nvidia图形卡。例如,我目前使用的计算机有一个Intel Core i7-8650U CPU和一个Intel UHD Graphics 620 GPU

使用
multiprocessing
Python库中的
mp.cpu\u count()
告诉我,我有8个处理器,这对于我的问题来说太少了(我需要并行运行数千个进程)。因此,我着眼于基于GPU的解决方案,尤其是在。Intel UHD Graphics 620 GPU应该只有24个处理器,这是否意味着我只能使用它同时并行运行24个进程

更一般地说,我的问题(使用Python在一台简单的笔记本电脑上并行运行3000个进程)现实吗?如果是,您会推荐哪种软件解决方案

编辑

这是我的伪代码。在每个时间步
i
,我都调用函数
posterior\u update
。此函数独立使用3000次(每个粒子一次)函数
近似似然
,这似乎很难矢量化。理想情况下,我希望这3000个电话能够独立并行地进行

import numpy as np
import scipy.stats
from collections import Counter
import random
import matplotlib.pyplot as plt
import os
import time

# User's inputs ##############################################################

# Numbers of particles
M_out           = 3000

# Defines a bunch of functions ###############################################

def approx_likelihood(i,j,theta_bar,N_range,q_range,sigma_range,e,xi,M_in):
    
    return sum(scipy.stats.norm.pdf(e[i],loc=q_range[theta_bar[j,2]]*kk,scale=sigma_range[theta_bar[j,3]])* \
          xi[nn,kk]/M_in for kk in range(int(N_range[theta_bar[j,0]]+1)) for nn in range(int(N_range[theta_bar[j,0]]+1)))
    
def posterior_update(i,T,e,M_out,M_in,theta,N_range,p_range,q_range,sigma_range,tau_range,X,delta_t,ML):
         
    theta_bar = np.zeros([M_out,5], dtype=int)
    x_bar = np.zeros([M_out,M_in,2], dtype=int)
    u = np.zeros(M_out)
    x_tilde = np.zeros([M_out,M_in,2], dtype=int)    
    w = np.zeros(M_out)
    
    # Loop over the outer particles 
    for j in range(M_out):
                    
        # Computes the approximate likelihood u
        u[j] = approx_likelihood(i,j,theta_bar,N_range,q_range,sigma_range,e,xi,M_in)
    
    ML[i,:] = theta_bar[np.argmax(u),:]        
    # Compute the normalized weights w
    w = u/sum(u)
    # Resample
    X[i,:,:,:],theta[i,:,:] = resample(M_out,w,x_tilde,theta_bar)  
       
    return X, theta, ML

# Loop over time #############################################################
    
for i in range(T):
    
    print('Progress {0}%'.format(round((i/T)*100,1)))
        
    X, theta, ML = posterior_update(i,T,e,M_out,M_in,theta,N_range,p_range,q_range,sigma_range,tau_range,X,delta_t,ML)

以下是一些想法,不是对你问题的回答:

  • 您主要关心的是如何确定可以运行的并行进程的数量,这并不是那么简单。基本上,您可以认为您的计算机并行运行的进程数量与您拥有的CPU内核数量相同。但这最终取决于操作系统、计算机当前的工作负载等。此外,您可以将数据分块发送到进程,而不一定一次发送一项。或者,您可以将数据划分为您拥有的进程,例如6个进程,每个进程包含500项=3000项。最佳组合需要反复试验

  • 另一方面,GPU拥有大量可用的工作人员。如果你安装了英伟达驱动程序和OpenCL,在你的终端中发布命令<代码> CulnFiels/Cuth>,以了解你的硬件的能力。
  • 我在代码中使用GPU时发现的一个问题是,您需要用C语言将指令传递给设备。您的
    近似似然
    函数包含依赖于库的代码,这在C中很难复制

  • 但是,如果您估计您正在使用这些库来做一些可以用C编写的事情,请尝试一下。你也可以考虑使用NUBBA。< /P>
  • 首先,我将使用python的
    多处理
    。在这些方面:


你好,卡米尔,欢迎来到堆栈溢出。你试过什么?你查询过你的GPU吗?您是否尝试过python的
多处理
模块?您是否尝试过在CPU上使用
pyopencl
来利用矢量化?您可以发布一个您需要运行的代码示例吗?3000个进程听起来不太需要GPU。嗨@chapelo,我编辑了我的问题,添加了我的伪代码。目前我的主要问题是找出我的硬件能够处理的最大并行进程数。如果我正确理解了文档,使用
多处理
工具箱,我只能并行处理8个进程(也就是说我的CPU内核数),对吗?或者我可以增加这个数字吗?我的GPU也是如此,有没有办法找到我可以运行的最大并行进程数?我的问题最后是理论多于实际:对于给定的语言(Python、Julia或其他任何语言)和CPU/GPU硬件配置,我如何确定我可以运行的最大并行进程数?
import multiprocessing as mp

def f(j):
    return approx_likelihood(i, j, theta_bar, N_range, q_range, sigma_range, e, xi, M_in)

with mp.Pool() as pool:
    u = pool.map(f, range(M_out), chunksize=50)