alf*_*lfC 6 c++ hint allocator
标准分配器可以选择提示作为默认参数https://en.cppreference.com/w/cpp/memory/allocator/allocate
T* allocate( std::size_t n, const void * hint);
Run Code Online (Sandbox Code Playgroud)
暂且不说这在 C++20 中已被正式弃用(这显然并不意味着分配器不能具有提示参数):
您知道hint
现有代码或理论代码中标准或非标准分配器实现的良好用途吗?或者说它只是一个普通的历史遗迹?
我试图了解当前的提示是否可以帮助您在拥有多个设备(例如 GPU)时进行分配。
注 1:
我不是问如何在 cpu 或 gpu 中分配内存,我试图查看hint
在内部使用此参数的良好或经过验证的代码,大概是效率和特定类型的内存。即使它是一些奇异的系统。
注2: 我不是问如何/如果/什么作为提示参数传递(即“仅传递容器的当前指针”),就像链接的问题中一样。我是从实现自定义分配器的人的角度来问的。
Alin Jula 和 Lawrence Rauchwerger于 2009 年发表的论文“Two memory allocators that usehints to Improve locality”介绍了
\n\n\n两个局部性改进分配器,\n可以使用 C++ STL 库提供的分配提示,并且比最先进的分配器(例如 dlmalloc 和 PHKmalloc)\n性能分别平均提高 7% 和 17%,同时产生内存碎片低至 dlmalloc\xe2\x80\x99s。
\n
他们将分配器称为“TP”和“Medius”,并使用allocate()
\ 的提示参数来尝试分配提示附近的内存以提高数据局部性。为此,他们修改了 gcc 的 stdlibc++ 中的容器,以实际将提示传递给分配器。\nAlin Jula 的相应论文可以免费获取。
该作品的前身是同一作者 2006 年的“Custom Memory Allocation for Free”,其中介绍了分配器“Defero”。它显然使用相同的接口(即提示参数allocate()
)。
不幸的是,源代码的链接(http://parasol.tamu.edu/resources/downloads.php)已失效,我无法在网上找到它们。然而,L. Rauchwerger似乎仍然存在,如果您联系他,他可能愿意分享来源。
\nmmap
该mmap()
函数允许为内存提供提示地址。\n我能够找到一些实际执行此操作的来源(作者的网站):
namespace leimyalloc {\n template <typename T>\n class mmap_allocator {\n // ...\n pointer allocate (size_type num, void * hint = 0) {\n pointer p = (pointer) ::mmap(hint, num, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);\n int * val = (int *)p;\n if(val == MAP_FAILED)\n p = 0;\n return p;\n }\n // ...\n };\n}\n
Run Code Online (Sandbox Code Playgroud)\n但是,我找不到是否有人真正使用它。
\n搜索“mmap allocator”会给出这个和这个github 项目,但它们只是忽略该hint
参数。