8

我想在 python 中使用多个 cpu 对一个函数进行数值集成。我想做类似的事情:

from scipy.integrate import quad
import multiprocessing
def FanDDW(arguments):
  wtq,eigq_files,DDB_files,EIGR2D_files,FAN_files = arguments
  ...
  return tot_corr

# Numerical integration
def integration(frequency):
# Parallelize the work over cpus
  pool = multiprocessing.Pool(processes=nb_cpus)
  total = pool.map(FanDDW, zip(wtq,eigq_files,DDB_files,EIGR2D_files,FAN_files))
  FanDDW_corr = sum(total)
  return quad(FanDDW, -Inf, Inf, args=(zip(wtq,eigq_files,DDB_files,EIGR2D_files,FAN_files)))[0]

vec_functionint = vectorize(integration)
vec_functionint(3,arange(1.0,4.0,0.5))

“频率”也是一个全局变量(FanDDW(参数)外部)。它是一个向量,包含必须评估函数的位置。我想quad应该以一种聪明的方式选择频率。如何将它传递给 FanDDW,知道它不应该分布在 CPU 之间,而 pool.map 正是这样做的(这就是我将它作为全局变量而不将其作为参数传递给定义的原因)。

感谢您的任何帮助。

塞缪尔。

4

1 回答 1

0

所有经典的求积规则都有以下形式

在此处输入图像描述

的计算f(x_i)通常是最昂贵的,所以如果你想使用多个 CPU,你必须考虑如何设计你的f. 总和可以表示为标量积<w, f(x_i)>,当numpy.dot用于它时,它在大多数架构上使用线程。

quadpy(我的一个项目)用所有点一次调用你的被积函数,所以f你必须有机会对计算感兴趣。

import quadpy


def f(x):
    print(x.shape)  # (1, 50)
    return x[0] ** 2


scheme = quadpy.e1r2.gauss_hermite(50)
val = scheme.integrate(f)

print(val)  # 0.886226925452758
于 2019-08-15T10:26:53.190 回答