MPI发送128位整数数组

时间:2014-07-09 09:31:28

标签: c mpi

我有一个结构:

union W128_T {
uint32_t u[4];
uint64_t u64[2];
};
struct SFMT_T {
/** the 128-bit internal state array */
w128_t state[SFMT_N];
/** index counter to the 32-bit internal state array */
int idx;
};

它是伪随机发生器,mersenne twister的实现。我想向所有工作人员发送SFM_T元素。我有两个选择。

  1. 使用MPI_Derived类型:我使用MPI_Type为128位为状态数组创建MPI_Derived类型。我搜索了一下,我找到了MPI_Type的这个页面:IBM Knowledge Center-MPI Data Types。有128个浮点类型。我可以将它用于我的数据类型。
  2. 使用char数组存储状态数组:我计划创建一个大小为[SFMT_N * 16 + 2]的char数组,因为128位变量等于16个字符而+2表示idx变量。我不知道如何将状态数组更改为字符数组。我为这个序列化写了一些代码:

    typedef struct SFMT_T sfmt_t;
    
    char * serialize(sfmt_t* sfmt)
    {
       char buffer[SFMT_N*16+sizeof(int16_t)];
       int16_t tmp_size = 0 ;
       int8_t offset = 0;
       int i=0,j;
       tmp_size =(4*sizeof(uint32_t));
       for(i=0;i<SFMT_N;i++)
       {
          memcpy(buffer+offset,&sfmt->state[i].u, tmp_size);
          for(j=offset;j<offset+tmp_size;j++)
          {
              printf("buffer %c \n",buffer[j]);
           }
          offset += tmp_size;
       }
       memcpy(buffer+offset,&sfmt->idx,sizeof(uint16_t));
    
       return buffer;}
    
    
      void deserialize(char* buffer, sfmt_t* sfmt)
      {
           int16_t tmp_size,start,i ; 
           for(i=0;i<SFMT_N;i++)
           {
               start = sizeof(uint32_t)*4*i; 
               tmp_size =(4*sizeof(uint32_t));
               memcpy(sfmt->state[i].u,&buffer[start], tmp_size);}
    
          for(i=0;i<SFMT_N;i++)
          {
               printf("%d %d %d %d \n",sfmt->state[i].u[0],sfmt->state[i].u[1],sfmt->state[i].u[2],sfmt->state[i].u[3]);
          } }
    

    它并没有准确地给出我想要的东西。我错过了什么?

  3. 另外,我想知道哪种方式对分布式系统更有效。

0 个答案:

没有答案