18.2.6. shmalloc
shmalloc(3), shfree(3), shmemalign(3), shrealloc(3) - 对称堆内存管理函数。
18.2.6.1. 概述
C或C++:
#include <mpp/shmem.h>
void *shmalloc(size_t size)
void shfree(void *ptr)
void *shrealloc(void *ptr, size_t size)
void *shmemalign(size_t alignment, size_t size)
extern long malloc_error
18.2.6.2. 描述
shmalloc 函数返回一个指向至少 size 字节内存块的指针,该内存块经过适当对齐可用于任何用途。此空间是从对称堆中分配的(与 malloc(3) 不同,后者是从私有堆中分配)。
shmemalign 函数在对称堆中分配一个内存块,该内存块的字节对齐方式由 alignment 参数指定。
shfree 函数会释放指针 ptr 所指向的内存块,使其可被重新分配使用。如果 ptr 为空指针,则不执行任何操作;否则,若参数与之前对称堆函数返回的指针不匹配,或该内存空间已被释放,则会设置 malloc_error 来指示错误,同时 shfree 函数返回。
shrealloc 函数将指针 ptr 所指向的内存块大小更改为由 size 参数指定的字节数。
块的内容在不超过新旧尺寸较小值的情况下保持不变。如果新尺寸更大,则新分配部分的值是不确定的。如果ptr为空指针,shrealloc函数的行为类似于指定大小的shmalloc函数。如果size为0且ptr不是空指针,则释放其指向的块。否则,如果ptr与之前对称堆函数返回的指针不匹配,或者空间已被释放,则设置malloc_error变量以指示错误,并且shrealloc返回空指针。如果无法分配空间,则ptr指向的块保持不变。
shmalloc、shfree和shrealloc函数的作用是让应用程序中的多个PE能够分配对称且可远程访问的内存块。这些内存块随后可用于(shmem)通信例程。这些函数在返回前都会调用shmem_barrier_all(3)函数;这确保了所有PE都参与内存分配,并且本地PE返回后其他PE上的内存即可使用。
用户有责任在所有PE上使用相同的参数调用这些函数;如果使用了不同大小的参数,后续调用可能无法在所有PE上返回相同的对称堆地址。
18.2.6.3. 注意事项
对称堆的总大小在作业启动时确定。可以通过SHMEM_SYMMETRIC_HEAP_SIZE环境变量来调整堆的大小。更多详情请参阅intro_shmem(3)手册页。shmalloc、shfree和shrealloc函数与私有堆分配函数的不同之处在于,应用程序中的所有PE都必须调用它们(使用屏障来确保这一点)。
18.2.6.4. 返回值
shmalloc函数返回指向已分配空间的指针(在所有PE上应保持一致);否则返回空指针(并设置malloc_error)。shfree函数不返回值。shrealloc函数返回指向重新分配空间的指针(地址可能发生变动);否则返回空指针(并设置malloc_error)。
另请参阅
intro_shmem(3) my_pe(3) start_pes(3)