-void *smpi_shared_malloc_global__(size_t size, const char *file, int line, size_t *shared_block_offsets, int nb_shared_blocks) {
- void *mem;
- xbt_assert(smpi_shared_malloc_blocksize % PAGE_SIZE == 0, "The block size of shared malloc should be a multiple of the page size.");
+#define HUGE_PAGE_SIZE 1<<21
+
+/*
+ * Similar to smpi_shared_malloc, but only sharing the blocks described by shared_block_offsets.
+ * This array contains the offsets (in bytes) of the block to share.
+ * Even indices are the start offsets (included), odd indices are the stop offsets (excluded).
+ * For instance, if shared_block_offsets == {27, 42}, then the elements mem[27], mem[28], ..., mem[41] are shared. The others are not.
+ */
+void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int nb_shared_blocks)
+{
+ char *huge_page_mount_point = xbt_cfg_get_string("smpi/shared-malloc-hugepage");
+ const bool use_huge_page = huge_page_mount_point[0] != '\0';
+ smpi_shared_malloc_blocksize = static_cast<unsigned long>(xbt_cfg_get_double("smpi/shared-malloc-blocksize"));
+ void *mem, *allocated_ptr;
+ size_t allocated_size;
+ if(use_huge_page) {
+ xbt_assert(smpi_shared_malloc_blocksize == HUGE_PAGE_SIZE, "the block size of shared malloc should be equal to the size of a huge page.");
+ allocated_size = size + 2*smpi_shared_malloc_blocksize;
+ }
+ else {
+ xbt_assert(smpi_shared_malloc_blocksize % PAGE_SIZE == 0, "the block size of shared malloc should be a multiple of the page size.");
+ allocated_size = size;
+ }
+
+