C++中的错误共享
False sharing in C++
我有几个类受到缓存争用的影响,并使用"new"运算符进行分配。我能以某种方式确保"new"返回一个与缓存行对齐的地址吗?
我正在使用GCC(如果不可能移植的话)。
您可以将memalign
或_aligned_alloc
分别用于glibc或windows CRT系统。您甚至可以使用像nedmalloc这样的自定义分配器,并让它对齐块,这也可以为您提供一些其他额外的好处。
您还应该用__attribute__((aligned(64)))
标记它们,以防它们被静态分配。
解决这个问题的最简单方法是使对象足够大,这样它们就不能共享缓存线。使用gcc,你可以设置类的对齐(我假设你的对象比缓存线小,因为你会遇到争用):
class foo {} __attribute__((aligned(2 * CL)));
当然,您需要为CL
的体系结构插入正确的Cachelinesize(或者将其放入宏中并在那里使用)。我使用的缓存行大小是缓存行大小的两倍,因为据我所知,new
并不能保证它确实能确保对齐。因此,由于对象不能保证从缓存行的开头开始,因此您仍然可以在同一个缓存行中获得不同对象的部分(即一个对象的结尾和另一个的开头)。如果始终保持对齐,__attribute__((aligned(CL)))
就可以了。当然,这需要你改变你的结构,浪费大量空间。
您也可以在memalign
的基础上编写自己的new
(请参阅此处了解如何做到这一点)。对于更具创可贴类型的解决方案,您也可以直接使用memalign
,并使用placement new将对象放置在分配的空间内。当然,这会让使用这些对象的代码变得不那么好。
您可以使用placement new
将对象构造到给定的内存区域中:
// Instantiate object into a pre-allocated buffer
obj = new (buf) TheClass();
要获得对齐的缓冲区buf
,可以使用memalign
、sbrk
或mmap
。
- 加载共享库时C++错误:libopencv_ximgproc.so.4.4
- 共享内存:MapViewOfFile 返回错误 5
- 为 Python 构建共享库C++时出现分段错误
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- c++ 链接器错误"针对'.rodata.str1.1'的重新定位R_X86_64_32"链接 CXX 共享库 libsrt.so
- 共享指针取消引用错误
- 避免错误共享以提高性能
- 在共享内存中插入映射映射时出现编译器错误
- GDB 共享库中的文件名错误
- 如何更改路径以修复错误"./main:加载共享库 libmkl_core.so 时出错?
- 错误:无法打开共享对象文件:没有此类文件或目录
- 共享库中使用"使用命名空间"定义的符号错误
- OpenMP 环路阵列访问中的错误共享
- PHP / C++:共享内存时出现shm_open()错误
- 加速进程间:管理共享内存错误
- 通过 Boost Python 在C++对象之间传递共享指针的隔离错误
- 如何处理加载错误的共享库版本的情况
- 加载共享库时出现"错误:libSDL2_mixer-2.0.so.0:无法打开共享对象文件:没有这样的文件或目录
- openMP 性能不佳,共享错误