多线程和CPU缓存

2024-04-13

我正在使用多个线程在 C 中实现图像过滤操作,并使其尽可能优化。但我有一个问题:如果线程 0 访问内存,并且同时线程 1 访问同一内存,它会从缓存中获取它吗?这个问题源于这两个线程可能运行在 CPU 的两个不同内核中的可能性。因此,另一种说法是:所有内核是否共享相同的公共高速缓存?

假设我有如下的内存布局

整数输出[100];

假设有 2 个 CPU 核心,因此我生成两个线程来并发工作。一种方案是将内存分为两个块:0-49 和 50-99,并让每个线程在每个块上工作。另一种方法可能是让线程 0 处理偶数索引,如 0 2 4 等。而另一个线程处理奇数索引,如 1 3 5 ...。后面的技术更容易实现(特别是对于 3D数据),但我不确定是否可以通过这种方式有效地使用缓存。


这个问题的答案很大程度上取决于体系结构和缓存级别,以及线程实际运行的位置。

例如,最近的 Intel 多核 CPU 具有每个核心的 L1 高速缓存,以及在同一 CPU 封装中的核心之间共享的 L2 高速缓存;然而,不同的 CPU 封装将有自己的 L2 缓存。

即使当您的线程在一个包内的两个核心上运行时,如果两个线程都访问同一缓存行中的数据,则该缓存行将在两个 L1 缓存之间跳跃。这is效率非常低,你应该设计你的算法来避免这种情况。


有一些评论询问如何避免这个问题。

从本质上讲,它实际上并不是特别复杂 - 您只是想避免两个线程同时尝试访问位于同一缓存行上的数据,其中至少有一个线程正在写入数据。 (只要所有线程都只reading数据,没有问题 - 在大多数架构上,只读数据可以存在于多个缓存中)。

为此,您需要知道缓存行大小 - 这因体系结构而异,但目前大多数 x86 和 x86-64 系列芯片使用 64 字节缓存行(有关其他体系结构,请参阅体系结构手册)。您还需要知道数据结构的大小。

如果您要求编译器将感兴趣的共享数据结构与 64 字节边界对齐(例如,您的数组output),那么您就知道它将从一个缓存行的开头开始,并且您还可以计算后续缓存行边界在哪里。如果你的int是 4 个字节,那么每个缓存行将包含 8 个字节int价值观。只要数组从缓存行边界开始,那么output[0]通过output[7]将位于一个缓存行上,并且output[8]通过output[15]就下一个。在这种情况下,您将设计算法,使每个线程在相邻的块上工作int值是 8 的倍数。

如果您存储复杂struct类型而不是简单的int, the pahole http://lwn.net/Articles/206805/实用性将会有用。它将分析struct在编译的二进制文件中输入类型,并向您显示布局(包括填充)和总大小。然后你可以调整你的struct使用此输出 - 例如,您可能需要手动添加一些填充,以便您的struct是高速缓存行大小的倍数。

在 POSIX 系统上,posix_memalign()函数对于分配具有指定对齐方式的内存块非常有用。

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

多线程和CPU缓存 的相关文章

  • WebClient.DownloadDataAsync 冻结了我的 UI

    我在 Form 构造函数中的 InitializeComponent 之后有以下代码 using WebClient client new WebClient client DownloadDataCompleted new Downloa
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • 叮当错误?命名空间模板类的朋友

    以下代码在 clang 下无法编译 但在 gcc 和 VS 下可以编译 template
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • 从 falcon 身份验证重定向

    在我的 falcon 应用程序中 我想从身份验证功能重定向到另一个页面 我正在这样做 resp status falcon HTTP 301 resp set header Location http foo bar com 8004 fa
  • 如何使用C读取文件夹中的所有文件

    我希望读取特定文件夹中的所有文本文件 这些文件的名称没有任何共同的模式 否则任务会更容易 read a file from the directory Perform a common operation write output to a
  • android:GIF动画循环完整监听器

    我有一张 GIF 图像 想要在启动屏幕中加载 我遇到过几个像这样的图书馆android gif 可绘制 https github com koral android gif drawable and Glide https github c
  • 如何在 MATLAB 循环中重命名变量?

    有人可以告诉我是否存在一种方法可以在 MATLAB 循环的每次迭代中重命名变量吗 实际上 我想在循环中使用不同的名称保存一个变量 并结合循环的索引 谢谢 根据您的评论 我建议使用单元阵列 http www mathworks nl help
  • AppBarLayout + NestedScrollView + RecyclerView不会滚动

    您好 我对 google support appbarLayout 有疑问 我的布局结构如下 问题是 一旦嵌套滚动视图滚动到顶部 我的回收器视图就不会滚动 我尝试了几乎所有解决方案 但似乎没有任何效果
  • 有没有办法限制 Bazel 使用的 CPU 核心数量?

    有没有办法告诉 Bazel 在构建时可以使用多少个 CPU 核心 TL DR 我在 VMware Workstation 上构建 TensorFlow 作为虚拟机 我可以调整虚拟机的处理器和内核数量 在构建 TensorFlow 的过程中
  • 等待 UIView 动画循环完成的最佳方法是什么?

    我正在尝试循环多个UIViews并对每个动画执行动画 但我想知道所有动画何时完成 动画循环完成后调用函数的最佳方法是什么 或者 有没有办法等到所有都完成 我尝试使用setAnimationDidStopSelector 但它不着火 在这种情
  • 你能在 Swift 中创建匿名内部类吗?

    我厌倦了宣布整个班级都有能力处理UIAlertView通过使它们延伸来点击UIAlertViewDelegate 当我有多种可能时 它开始感觉混乱和错误UIAlertViews 并且必须区分在处理程序中单击了哪个 我真正想要的是创建一个实现
  • 如何使用 Angular-CLI 重写反向代理中的路径?

    我已经使用 angular2 CLI 设置了反向代理 如下所示 api customer target http localhost 9010 secure false 我的问题是远程 API 在路径 customer 上公开服务 但反向代
  • 单节点图对forceCenter没有反应?

    我正在启动一个带有单个节点的图形项目 当我将它拖到某个地方时 我希望它能顺利回到 svg 的中心 但事实并非如此 它glitches回到中心 var simulation d3 forceSimulation force center d3
  • SBT停止运行而不退出

    如何在不退出的情况下终止 SBT 中的运行 我正在尝试 CTRL C 但它退出 SBT 有没有办法在保持 SBT 打开的情况下仅退出正在运行的应用程序 从 sbt 版本 0 13 5 开始 您可以添加到您的 build sbt cancel
  • 使用 Sikuli 进行拖放

    我在使用 Sikuli 拖放时遇到问题 我想在任何其他方向 上 下 左 右 拖动某些东西固定数量的像素 这看起来应该有效 t find 1325249963143 png dragDrop t t x 100 t y 100 Sikuli
  • 在 Eclipse 中导入动态 Web 项目?

    我使用 eclipse 3 6 2 Helios 和 tomcat 7 和 myfaces 1 2 10 当我想导入动态 Web 项目时遇到问题 我在工作区中导入项目并执行配置并设置 jar 文件 但是当我在 tomcat 中运行该项目时
  • 我希望我的字段只接​​受整数,并且我已将该字段保留在所需的验证中? [复制]

    这个问题在这里已经有答案了 我已经完成了我的完整项目 但它缺少这一要求 我自己无法在我的项目中解决这个问题 你会使用CodeIgniter吗表单验证 http ellislab com codeigniter user guide libr
  • 为什么 Service Worker 只能通过 HTTPS 工作?

    根据最初的提案 关于 更喜欢安全来源以获得强大的新功能 http www chromium org Home chromium security prefer secure origins for powerful new features
  • Android Studio 与 ndk 和 googletest

    我正在尝试设置我的 CI 服务器以与 Android Studio 一起使用 我希望通过新的 UI 运行 NDK 的单元测试 我正在使用 GoogleTest 当我从命令行构建时 gcov 可以完美地实现代码覆盖率 我遇到的问题是 UI 中
  • 当名称的开头保持相同而结尾不同时,将 CSS 样式应用于 ID 元素

    在 WordPress 中 博客文章的标题通常使用 ID 元素进行格式化 该 ID 元素由永远不会变化的前缀 例如 post 组成 后跟 WordPress 生成的可变数字后缀 对应于唯一的连续帖子编号 每个帖子 在 WordPress 主
  • 根据其中一个字段对元组进行排序

    我的问题与下面的问题相同 但答案很模糊 我不明白如何进行 将 List 从最高到最低排序 https stackoverflow com questions 4017728 sort a listtuple from highest to
  • 将 JSON 数据的 NSString 转换为 NSArray [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个N
  • 多线程和CPU缓存

    我正在使用多个线程在 C 中实现图像过滤操作 并使其尽可能优化 但我有一个问题 如果线程 0 访问内存 并且同时线程 1 访问同一内存 它会从缓存中获取它吗 这个问题源于这两个线程可能运行在 CPU 的两个不同内核中的可能性 因此 另一种说