带有 MPI 的 C 中的结构数组

Posted

技术标签:

【中文标题】带有 MPI 的 C 中的结构数组【英文标题】:Array of Structures in C with MPI 【发布时间】:2018-06-05 21:51:09 【问题描述】:

我有一个相对的问题,我已经定义了结构,我希望结构数组有这个信息(处理器名称和处理器的计算时间)这是我的代码的一部分:

struct stru

   double  arr_time[50];
   char pname[50];   
;
int main (int argc, char *argv[])


struct stru all_info[50];

   MPI_Status status;
   MPI_Init(&argc,&argv);
   MPI_Comm_rank(MPI_COMM_WORLD,&process_id);
   MPI_Comm_size(MPI_COMM_WORLD,&num_of_processes);

    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);
if (process_id == 0)
  //do somthing

if (process_id > 0)
  
    double start = MPI_Wtime();
    for (k=0; k<array_size; k++)
      for (i=0; i<rows; i++)
      
          c[i][k]=0.0;                     
          for (j=0; j<array_size; j++)
           c[i][k] = c[i][k] + a[i][j] * b[j][k];
            
      end_time = MPI_Wtime() - start;  
        all_info[i].arr_time[i] = end_time;
      for (int i=1 ;i <= numworkers ;i++)
            strcpy( all_info[i].pname, processor_name);

         printf(" time  = %f  for processor %s 
         \n",all_info[i].arr_time, all_info[i].pname);




      MPI_Gather( &end_time, 1, MPI_DOUBLE, &all_info[i].arr_time, 1, 
       MPI_DOUBLE, 0, MPI_COMM_WORLD);

if (process_id == 0)

      for(i = 1; i <= numworkers; i++ )
      
         printf("  time   %f  for processor %s 
         \n",all_info[i].arr_time , all_info[i].pname);
      

如果我在(process_id == 0) 中打印它,我没有结果! 输出是

 time   0.000000  for processor  
 time   0.000000  for processor  
 time   0.000000  for processor 

如果我在if (process_id &gt; 0) 中打印,则只是打印时间

事实上,我不知道如何将 Structure 与 MPI 一起使用,谁能给我建议如何生成具有处理器名称和他的时间的结构数组? 提前感谢您的宝贵时间。

【问题讨论】:

请正确缩进和格式化您的代码,现在很难阅读。 这是我的代码的一部分,我只是在问如何将(end_time 和 processor_name)放入结构数组中? 这是一个很好的问题,并且格式化代码可以很好地防止错误。 同时,请努力发布正确缩进的可编译代码。 @Gilles Gouaillardet,我想要的结构数组的所有想法都必须具有每个并行工作的处理器的名称和时间(每个处理器都有时间和名称) 【参考方案1】:

在这一行:

processor_name[MPI_MAX_PROCESSOR_NAME];

您开始使用数组变量processor_name 而不在任何地方定义它。

你在它前面缺少像all_info[i]. 这样的东西。就像你有一点点:

all_info[i].processor_name;

然后,为了存储字符串,您的 processor_name 需要内存。单个char 只是一个字节(即一个字母)。所以让我们假设这些名字从不长于 255,你会得到:

struct stru

   double end_time;
   char   processor_name[256];   
;

您的代码中有很多基本错误,您的问题似乎表明您缺乏对 C 编程的基本了解。因此,我的建议是花更多时间学习这门语言。

【讨论】:

我是在结构中定义的,不知道是真是假? 我做了你的更新,我有这个错误(错误:'processor_name' undeclared (first use in this function) processor_name[MPI_MAX_PROCESSOR_NAME];) 我更新了我的代码,我摆脱了错误,但是打印结果时我没有结果......谢谢你,圣诞快乐! :) 对于这个提示 "char processor_name[256]; "加一个【参考方案2】:

这里出现错误是因为你没有定义任何类型processor name。 如果我理解您要正确尝试的内容,那么您似乎正在尝试访问结构的属性。为此,您可能需要使用 . 运算符。为此,您可能需要定义一个数组

struct stru all_info[MPI_MAX_PROCESSOR_NAME];

而不是

struct stru all_info[50];

【讨论】:

在这种情况下,我只找到处理器名称??对吗?? 我希望所有信息数组必须包含处理器名称和我计算的时间 我更新了我的代码,我摆脱了错误,但是打印结果时没有结果。

以上是关于带有 MPI 的 C 中的结构数组的主要内容,如果未能解决你的问题,请参考以下文章

C-MPI 发送创建的带有字符数组的 typedef 结构

C 中的 MPI_Scatter 结构

使用 MPI_Type_create_struct() 在 C 中传输包含动态数组的结构

如何使用 MPI 传输带有动态数组的自定义结构?

MPI 发送带有字节数组和整数的结构

C中的结构序列化并通过MPI传输