当前位置: 首页 > 面试题库 >

NUMA感知的高速缓存对齐的内存分配

鱼意远
2023-03-14
问题内容

在linux系统中,pthreads库为我们提供了用于对齐缓存的功能(posix_memalign),以防止错误共享。要选择架构的特定NUMA节点,我们可以使用libnuma库。我想要的是同时需要两者的东西。我将某些线程绑定到某些处理器,并且我想为来自相应NUMA节点的每个线程分配本地数据结构,以减少线程的内存操作延迟。我怎样才能做到这一点?


问题答案:

如果您只是希望围绕NUMA分配器获得对齐功能,则可以轻松构建自己的对齐功能。

想法是将未对齐的malloc()空间称为更多空间。然后返回第一个对齐的地址。为了释放它,您需要将基址存储在已知位置。

这是一个例子。只需用适当的名称替换名称:

pint         //  An unsigned integer that is large enough to store a pointer.
NUMA_malloc  //  The NUMA malloc function
NUMA_free    //  The NUMA free function

void* my_NUMA_malloc(size_t bytes,size_t align, /* NUMA parameters */ ){

    //  The NUMA malloc function
    void *ptr = numa_malloc(
        (size_t)(bytes + align + sizeof(pint)),
        /* NUMA parameters */
    );

    if (ptr == NULL)
        return NULL;

    //  Get aligned return address
    pint *ret = (pint*)((((pint)ptr + sizeof(pint)) & ~(pint)(align - 1)) + align);

    //  Save the free pointer
    ret[-1] = (pint)ptr;

    return ret;
}

void my_NUMA_free(void *ptr){
    if (ptr == NULL)
        return;

    //  Get the free pointer
    ptr = (void*)(((pint*)ptr)[-1]);

    //  The NUMA free function
    numa_free(ptr); 
}

要使用此功能,您需要调用my_NUMA_free分配的任何内容my_NUMA_malloc



 类似资料:
  • 问题内容: 为了防止错误共享,我想将数组的每个元素与高速缓存行对齐。因此,首先我需要知道高速缓存行的大小,因此我为每个元素分配了字节数。其次,我希望数组的开头与缓存行对齐。 我正在使用Linux和8核x86平台。首先,我如何找到缓存行大小。其次,如何在C中对齐缓存行。我正在使用gcc编译器。 因此,假设缓存行大小为64,结构将如下所示。 依此类推,假设0-63与高速缓存行对齐。 问题答案: 要知道

  • 现在的CPU比25年前要精密得多了。在那个年代,CPU的频率与内存总线的频率基本在同一层面上。内存的访问速度仅比寄存器慢那么一点点。但是,这一局 面在上世纪90年代被打破了。CPU的频率大大提升,但内存总线的频率与内存芯片的性能却没有得到成比例的提升。并不是因为造不出更快的内存,只是因为太 贵了。内存如果要达到目前CPU那样的速度,那么它的造价恐怕要贵上好几个数量级。 如果有两个选项让你选择,一个

  • 当目标指令集为x86/x64时,未对齐的内存读写不会导致错误的结果;而在Emscripten环境下,编译目标为asm.js与WebAssembly时,情况又各有不同。 info 这里“未对齐”的含义是:欲访问的内存地址不是欲访问的数据类型大小的整数倍。 4.2.1 asm.js C代码如下: //unaligned.cc struct ST { uint8_t c[4]; float f; }

  • 页面是动态生成的,因为现在我需要,所以不能缓存整个页面。但至少我想缓存所有静态内容,包括页面中包含的图像,有两种方式: 以及以常规的方式 在Varnish配置文件中,图像如和url被设置为缓存。 当页面在浏览器中打开两次,清漆似乎工作正常,和年龄是 现在,当我运行一个脚本来预热清漆缓存,然后第一次在浏览器中打开任何页面时,所有的jpgs、pngs和image.php年龄总是=0 用于预热缓存的脚本

  • UMD™ Cache(高速缓存)    将使用频率较高的数据蓄积至PSP™主机的内存,以减少UMD™的读取次数,加快数据读取速度的设定。 关 不变更UMD™的读取速度。 开 减少UMD™的读取频率。 提示 设定为[开]时,可能无法经由Ad Hoc模式与其他PSP™正确通讯。此时请调整为[关]。

  • Adobe Bridge 可处理并维护所有音频和视频回放文件的高速缓存。这项功能可以提升回放文件的性能,因为只要您以后想查看这些文件,就可以随时访问。建议您定期清理陈旧和不使用的媒体高速缓存文件,以便优化性能。在删除了高速缓存文件后,如果源媒体需要,则随时可以重新生成相应的高速缓存文件。 设置媒体高速缓存首选项 可执行以下步骤来设置媒体高速缓存首选项: 执行以下操作之一: (Windows) 选择