【问题标题】:Can memset be parallelized on 4 cores?memset 可以在 4 个内核上并行化吗?
【发布时间】:2012-10-02 21:46:42
【问题描述】:

我不确定。我可以在四个核心上编写一个大的 memset(例如 10 MB)来获得加速吗?

这种 ram-chip 并行化是否可行,以及触发其他线程的时间成本有多大 - 是超过一毫秒还是更少?

【问题讨论】:

  • 这样的操作如果你并行化它可能只会变得更慢 - 你会有多个核心/cpu争夺对内存总线的访问。
  • 也许使用特定指令一次移动更多字节会对您有所帮助。只有当数据分布在不同的内存部分时,使用并行化才有优势。
  • 并行memset 可能更快的唯一情况是在 NUMA 架构上具有非常非常大的内存块,其中每个内核都在连接到其处理器的内存上工作。
  • @MarcB 并且您需要“加入”线程,如果 CPU 之间的调度不是很统一,可能会浪费额外的时间。
  • 如果memset 可以从您的架构中的这种设计中受益,您不是已经拥有了吗?如果您不信任编写您的memset 的人来提供优化的实现,那么您不应该相信他们会做很多事情,因为这是图书馆作者确保做对的第一件事。跨度>

标签: c windows multithreading winapi memory


【解决方案1】:

你指出了一个正确的问题,同时很难给出一个简单的答案。涉及多个方面。

  1. 启动新线程(或从某个缓存中挑选它们)的开销;
  2. 内存总线冲突。
  3. 上述各方面各不相同,不同平台的成本也大不相同。

更大的 PC 有多个内存总线。较小的只有一个。在单内存总线系统上,这没有任何意义。如果您的系统有多个内存总线(通道),那么您的数据数组可能会在内存库之间任意拆分。如果整个数组都位于同一个内存库中,则并行化将毫无用处。弄清楚阵列的布局又是一项开销。换句话说,在内核之间拆分操作之前,有必要弄清楚这是否值得做。

简单的答案是,这些难以预测的间接费用很可能会消耗收益并使整体结果变得更糟。

同时对于某些架构上的一个非常大的内存区域来说,这是有道理的。

【讨论】:

  • 是否值得在程序启动时确定是否值得将 memset 并行化并在运行时决定?
  • 这可能应该在操作系统启动期间发生。 CPU 对于将要启动的所有应用程序都是相同的。另一方面,内存库之间的划分总是不同的,不容易评估。
  • 在现代 CPU 上,单个 CPU 内核在写入零时很容易使所有内存总线饱和。所以即使那样,并行化也没有意义。
  • 你能给出一些确切的 CPU 的数字吗?比如从一个 CPU 内核发出内存命令的速度和内存控制器的速度?我会很高兴看到这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2015-09-15
  • 2023-03-09
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多