numba.prange 性能不佳

2024-05-26

我试图整理一个简单的例子来说明使用的好处numba.prange对于我自己和一些同事来说,但我无法获得像样的加速。我编写了一个简单的一维扩散求解器,它本质上是在一个长数组上循环,组合元素i+1, i, and i-1,并将结果写入elementi第二个数组的。这应该是并行 for 循环的一个非常完美的用例,类似于 Fortran 或 C 中的 OpenMP。

我的完整示例如下:

import numpy as np
from numba import jit, prange

@jit(nopython=True, parallel=True)
def diffusion(Nt):
    alpha = 0.49
    x = np.linspace(0, 1, 10000000)
    # Initial condition
    C = 1/(0.25*np.sqrt(2*np.pi)) * np.exp(-0.5*((x-0.5)/0.25)**2)
    # Temporary work array
    C_ = np.zeros_like(C)
    # Loop over time (normal for-loop)
    for j in range(Nt):
        # Loop over array elements (space, parallel for-loop)
        for i in prange(1, len(C)-1):
            C_[i] = C[i] + alpha*(C[i+1] - 2*C[i] + C[i-1])
        C[:] = C_
    return C

# Run once to just-in-time compile
C = diffusion(1)

# Check timing
%timeit C = diffusion(100)

当与parallel=False,这大约需要 2 秒,并且parallel=True大约需要1.5秒。我在具有 4 个物理核心的 MacBook Pro 上运行,活动监视器报告无论是否有并行化,CPU 使用率均为 100% 和大约 700%。

我原本预计加速速度会接近 4 倍。难道我做错了什么?


较差的可扩展性肯定是由于台式机上所有内核共享的 RAM 饱和所致。的确,你的代码是受内存限制的与 CPU(或 GPU)的计算能力相比,现代机器的内存吞吐量非常有限。因此,1 或 2 个核心通常足以使大多数台式机上的 RAM 饱和(计算服务器需要更多的核心)。

在具有 40~43 GiB/s RAM 的 10 核 Intel Xeon 处理器上,代码并行耗时 1.32 秒,顺序耗时 2.56 秒。这意味着 10 个核心的速度仅提高 2 倍。话虽这么说,并行循环读取了完整的C每个时间步一次数组,并且还读+写完整的C_每个时间步一次数组(x86 处理器默认需要读取写入的内存,因为写入分配缓存策略). The C[:] = C_做同样的事情。这意味着(2*3)*(8*10e6)*100/1024**3 = 44.7GiB 或 RAM 的并行读/写时间仅为 1.32 秒,从而实现 33.9 GiB/s 的内存吞吐量,达到 RAM 带宽的 80%(非常适合此用例)。

为了加速此代码,您需要从 RAM 读取/向 RAM 写入更少的数据,并在缓存中尽可能多地计算数据。首先要做的是使用双缓冲使用两个视图的方法,以避免非常昂贵的副本。另一个优化是尝试同时并行执行多个时间步。理论上这是可能的,使用复杂的梯形平铺策略 https://crd.lbl.gov/assets/pubs_presos/sirev09-stencil.pdf但在实践中实施起来非常棘手,尤其是在 Numba 中。高性能模板库应该可以为您做到这一点。这样的优化不仅应该提高顺序执行和可扩展性生成的并行代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numba.prange 性能不佳 的相关文章

随机推荐

  • 配置多个数据库Entity Framework 6

    在我的解决方案中 我有 2 个使用 Entity Framework 6 的项目 每个项目都指向不同的数据库 都使用相同的数据提供 SQL Server 我的解决方案中的第三个项目需要使用这两个数据库 我的问题是如何配置这些上下文 我尝试在
  • OOP Javascript - 是否需要“获取属性”方法?

    给定一个非常简单的 js 对象构造函数及其原型 function MyTest name this name name MyTest prototype getName function var myName this name retur
  • 如何在 Perl 中使用变量作为模块名称?

    我知道可以在 Perl 中使用变量作为包变量的变量名 我想使用变量的内容作为模块名称 例如 package Foo our names blah1 blah2 1 在另一个文件中 我希望能够将标量的内容设置为 foo 然后访问中的名称数组F
  • 分解大于 100 位的整数 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 X and Y是大于 100 位的整数 求整数P其在范围 X Y 并且保证了 最佳 素数分解 即具有最多的分解 unique主要原因 我所
  • 我可以指定默认的 AWS 配置文件吗?

    在我的开发环境中 我经常在多个 AWS 访问密钥之间切换 所以在我的 aws credentials文件 我有几个配置文件 然后 我可以通过指定以下内容将这些配置文件与 aws cli 一起使用 profile
  • XAMPP:作曲家返回错误而不是创建新的 laravel 项目

    使用ubuntu 16 04 LTS 在两个不同版本的地方安装了PHP 在root 7 0和XAMPP 5 6中 composer全局安装 现在我无法从lamp htdocs创建composer项目 xampp运行良好 作曲家已安装并运行良
  • 越狱的 iOS 从后台应用程序截图

    我正在为自己构建一个实用程序应用程序 当该实用程序在后台运行时 它可以截取前台运行的任何内容的屏幕截图 该实用程序将在越狱设备上运行 因此它可以访问私有 API 而不受沙箱的限制 由于实用程序应用程序在后台运行 作为守护程序或使用后台程序
  • 传递到字典中的模型项的类型为“Sitecore.Mvc.Presentation.RenderingModel”,但此字典需要类型为“X”的模型项

    我正在使用 Sitecore 7 和 ASP NET MVC 3 构建解决方案 并尝试使用自定义模型类 如中所述约翰 韦斯特的这篇博文 http www sitecore net france Community Technical Blo
  • @Nullable 和 SonarQube “有条件执行的块应该可达”警告

    包有以下package info java ParametersAreNonnullByDefault package foo import javax annotation ParametersAreNonnullByDefault 类有
  • Typescript 类似断言的类型保护

    这是否可以在没有限制的情况下限制类型if通过函数调用never返回例如undefined like assert在打字稿中 示例代码 interface Foo bar void function getFoo Foo undefined
  • 带有存储在文件中的通配符的 grep

    我希望 grep 通过读取需要从文本文件中过滤掉的内容来过滤掉行 这是我给 grep 的内容 它存储在foo txt Users 1337 X Users 1337 R Users 1337 W 这是它应该过滤的内容 它存储在bar txt
  • 包含 ListView 更新、CellValueFactory 的 JavaFX TableView

    我确实有一个引擎 其中包含以下列表中的部件 UPDATE 我更新了文本以提供示例 我想要一个包含 2 列 名称 零件 的引擎 TableView 我希望将 Column 部分呈现为 TableCell 中的 ListView 因此我重写了该
  • 在 CGridView 中显示另一个模型的属性

    在 Yii 中 我正在做多模型 我的数据库是这样的 Group id name Member id group id firstname lastname membersince 在组控制器中 我想显示成员的属性 一切工作正常 但是当我使用
  • Zuul不转发请求到其他微服务

    我正在使用 Spring Boot 微服务 我已经配置了 eureka zuul 代理和另一个微服务 帐户 如果我直接从帐户拨打电话 则工作正常 帐户和 zuul 服务器都显示在 eureka 上 当我尝试使用 zuul 代理进行访问时 它
  • CTRL + 单击 Sublime Text 2 中的绑定

    我多年来使用 IDE 的一个长期习惯是 CTRL 或命令 单击选择一个完整的单词 这相当于双击当前 ST2 中的单词 我希望能够在ST2中恢复这个能力 我会用按键绑定还是插件来解决这个问题 如果您创建一个sublime text 2 Pac
  • 如何用 C# 发送原始以太网数据包? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有办法通过 C 将原始数据包以太网发送到其他主机 在 Windows 7 中 如果有区别的话 根据 Saint pl 的建议 我找
  • 在浏览器中下载视频,而不是在新选项卡中播放 [CORS]

    I have a 并在其内部href属性 当我点击该属性时 我从第 3 方 api 获得了一个视频 URL a 浏览器打开一个新选项卡并播放视频而不是下载视频 PROBLEM 我需要实现的是点击后直接下载视频 a 而不是在新标签中播放并强制
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • c#.net MS Access 数据库,未安装 Access [重复]

    这个问题在这里已经有答案了 是否可以 我尝试过谷歌 但我一定是搜索了错误的关键词并且没有得到答案 我有一个仅由 2 3 人使用的小型应用程序 我想将其数据存储在数据库中 我无法安装任何 SQL 服务器 因此我认为访问将是最好的选择 将使用它
  • numba.prange 性能不佳

    我试图整理一个简单的例子来说明使用的好处numba prange对于我自己和一些同事来说 但我无法获得像样的加速 我编写了一个简单的一维扩散求解器 它本质上是在一个长数组上循环 组合元素i 1 i and i 1 并将结果写入element