gpt4 book ai didi

c++ - 我可以通过使用多线程更快地分配内存吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:45 24 4
gpt4 key购买 nike

如果我创建一个保留 1kb 整数数组 int[1024] 的循环,并且我希望它分配 10000 个数组,我可以通过从多个线程运行内存分配来使其更快吗?

我希望它们在堆中。

假设我有一个多核处理器来完成这项工作。

我已经试过了,但是它降低了性能。我只是想知道,我是不是编写了错误的代码,还是我对内存分配一无所知?

答案是否取决于操作系统?如果可以,请告诉我它在不同平台上的工作原理。

编辑:

整数数组分配循环只是一个简化的例子。不要费心告诉我如何改进它。

最佳答案

这取决于很多事情,但主要是:

  • 操作系统
  • 你正在使用的malloc的实现

操作系统负责分配您的进程可以访问的“虚拟内存”,并构建一个将虚拟内存映射回实际内存地址的转换表。

现在,malloc 的默认实现通常是保守的,并且将简单地围绕所有这些设置一个巨大的锁。这意味着请求是串行处理的,唯一从多个线程而不是一个线程分配的东西会减慢整个过程。

还有更聪明的分配方案,通常基于池,它们可以在其他 malloc 实现中找到:tcmalloc(来自 Google)和 jemalloc(由 Facebook 使用)是为多线程应用程序中的高性能而设计的两个此类实现。

虽然没有 Elixir ,但有时操作系统必须执行虚拟 <=> 真正的翻译,这需要某种形式的锁定。

最好的办法是按竞技场分配:

  • 一次分配大块(竞技场)
  • 将它们分成适当大小的数组

没有必要并行化竞技场分配,你最好尽可能地请求最大的竞技场(请记住,太多的分配请求可能会失败),然后你可以并行化拆分.

tcmallocjemalloc 可能有点帮助,但是它们不是为分配设计的(这是不寻常的),我不知道如果可以配置他们请求的竞技场的大小。

关于c++ - 我可以通过使用多线程更快地分配内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com