Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中使用MPI的分段错误?_C_Parallel Processing_Mpi - Fatal编程技术网

C中使用MPI的分段错误?

C中使用MPI的分段错误?,c,parallel-processing,mpi,C,Parallel Processing,Mpi,所以我需要在C中使用MPI并行实现一个向量加法函数。 不幸的是,当我运行它时,它会打印大量内存位置的跟踪,然后显示以下消息: ================================================================================== = BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES = PID 2419 RUNNING AT hbaum-pc = EXIT CODE:

所以我需要在C中使用MPI并行实现一个向量加法函数。 不幸的是,当我运行它时,它会打印大量内存位置的跟踪,然后显示以下消息:

==================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 2419 RUNNING AT hbaum-pc
=   EXIT CODE: 6
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Aborted (signal 6)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions
这是我的功能代码:

double* vector_vector_addition_parallel(double* a, double* b, int length)
{
  int rank, size, error;
  double* result = (double*)malloc(sizeof(double)*length);

  error = MPI_Init(NULL,NULL);
  error = MPI_Comm_size(MPI_COMM_WORLD,&size);
  error = MPI_Comm_rank(MPI_COMM_WORLD,&rank);

  int sublist_length = (int)(length/size);

  double* sub_a = (double*)malloc(sizeof(double) * sublist_length);
  double* sub_b = (double*)malloc(sizeof(double) * sublist_length);


  error = MPI_Scatter(a, sublist_length, MPI_DOUBLE, sub_a, sublist_length, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  error = MPI_Scatter(b, sublist_length, MPI_DOUBLE, sub_b, sublist_length, MPI_DOUBLE, 0, MPI_COMM_WORLD);

  double* buffer = (double*)malloc(sizeof(double)*sublist_length);
  for(int i = 0; i < sublist_length; i++)
  {
    buffer[i] = sub_a[i] + sub_b[i];
  }

  error = MPI_Gather(buffer,sublist_length,MPI_DOUBLE,result,length,MPI_DOUBLE,0,MPI_COMM_WORLD);

  error = MPI_Finalize();

  return result;
}
我用

mpicc <source_file>
mpicc
并运行它

mpiexec -n 4 <path_to_executable>
mpiexec-n4
我还尝试使用gdb调试代码,但根据gdb的说法,没有问题,而且非常好。当我使用printf输出向量时,当我通过gdb运行程序时,它甚至会打印正确的向量

我认为我使用MPI_Gather的方式有问题,因为当我注释它时,代码将在没有分段错误的情况下运行,尽管显然不是正确的答案,因为我需要使用MPI_Gather来获得结果


如何改进代码以避免出现分段错误?

事实上,您的
MPI\u聚集是一个问题。接收计数参数应该是从任何单个进程接收的元素数。因此,对于
记录
,您应该传递
子列表的长度
,而不是
长度
,即:

MPI_Gather(buffer,sublist_length,MPI_DOUBLE,result,sublist_length,MPI_DOUBLE,0,MPI_COMM_WORLD);

谢谢!很好用!
MPI_Gather(buffer,sublist_length,MPI_DOUBLE,result,sublist_length,MPI_DOUBLE,0,MPI_COMM_WORLD);