- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 openMPI 在 C 中编程。我的代码贴在下面。发生的事情是,每当我运行这个程序时,我都会收到一个段错误。我相信我已经通过使用这些 printf 语句隔离了问题。分段似乎发生在 MPI_Finalize() 之后。非常感谢任何帮助。
我收到的错误是:
[linuxscc003:10019] *** Process received signal ***
[linuxscc003:10019] Signal: Segmentation fault (11)
[linuxscc003:10019] Signal code: Address not mapped (1)
和我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char** argv)
{
int i = 0; //index
int comm_sz, my_rank;
int part_sum = 0;
//size of the array is hard-coded in,
MPI_Init(NULL,NULL);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
if(my_rank == 0)
{
int* array;
//generate the array of n elements
printf("There are %d array elements\n", comm_sz);
array = (int*)malloc(sizeof(int*)*comm_sz);
for(i = 0; i < comm_sz; i++)
{
//we don't want to count zero in here
//nobody likes zero
array[i] = (i+1);
}
for(i = 1; i < comm_sz; i++)
{
MPI_Send(&array[i], sizeof(int*), MPI_INT, i, 0, MPI_COMM_WORLD);
}
//part_sum = 1;
free(array);
printf("freed array!\n");
}
if(my_rank != 0)
{
MPI_Recv(&part_sum, sizeof(int*), MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("proc %d out of %d, I have received %d!\n", my_rank, comm_sz, part_sum);
}
printf("proc %d signing off!\n",my_rank);
MPI_Finalize();
printf("proc %d signed off!\n",my_rank);
return 0;
}
最佳答案
在这一行中:
array = (int*)malloc(sizeof(int*)*comm_sz);
sizeof(int*)
应该是 sizeof(int)
。
在这一行中:
MPI_Send(&array[i], sizeof(int*), MPI_INT, i, 0, MPI_COMM_WORLD);
sizeof(int*)
应该是 1。您指定要发送多少 MPI_INT
(而不是多少字节)。 sizeof(int)
可能是 4 或 8,因此您过度读取了缓冲区。
在这一行中:
MPI_Recv(&part_sum, sizeof(int*), MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
sizeof(int*)
应该是 1,同样的事情。
段错误可能发生在某些进程的 MPI_Finalize()
之前,而您认为它发生在之后,因为其他进程已完成其 MPI_Finalize()
。或者可能是因为您在堆栈上覆盖了 part_sum
,因此在调用 MPI_Finalize()
之前,损坏的堆栈不会导致问题。
关于c - 使用 MPI_Finalize() 后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15723840/
我正在使用 openMPI,而且我有一个奇怪的错误。 看来,即使在 MPI_Finalize() 之后,每个线程仍在运行。 我遵循了一个简单的 Hello World 程序的指南,它看起来像这样: #
我对以下代码有疑问: 大师: #include using namespace std; #include "mpi.h" #include #include #include #define
我有第一个进程 (test1),它动态生成第二个进程 (test2),然后等待从生成的组接收带有标记 1 的消息。生成的进程执行一些计算,然后向父组(包含第一个进程)发送一 strip 有标记 1 的
MPI 规范规定在每个线程退出前调用 MPI_Finalize。它如何处理断言等运行时错误? 如果我 assert(cond) 并且 cond 的计算结果为 false,我就没有机会调用 MPI_Fi
#include #include #include int main(int argc, char *argv[]) { int i, done = 0, n; double
我正在使用 openMPI 在 C 中编程。我的代码贴在下面。发生的事情是,每当我运行这个程序时,我都会收到一个段错误。我相信我已经通过使用这些 printf 语句隔离了问题。分段似乎发生在 MPI_
我遇到了 MPI_Finalize 的问题。当我可以 MPI_Finalize(); 时,我在程序末尾遇到了一个段错误,输出如下: A matrix = 48.3962 65.3245 15.0385
您好,对于具有多个 .hp 和 .cpp 文件的 C++ 大型 mpi 项目,是否应该有 MPI_Finalize();在每个使用 mpi 函数的头文件或 cpp 文件的末尾?还是应该在主 cpp 文
我正在编写一个简单的代码来学习如何定义 MPI_Datatype 并将其与 MPI_Gatherv 结合使用。我想确保我可以在一个进程中组合可变长度、动态分配的结构化数据数组,这似乎工作正常,直到我调
首先,我明确地说,我是法国人,而且我的英语不太好。 我正在开发 MPI 应用程序,遇到一些问题,希望有人可以帮助我。 正如我的文章标题中所报道的,当我必须终止我的应用程序然后调用 MPI_Finali
我正在尝试使用 MPI_Comm_Spawn 运行一个 mpi 程序。我生成 1 个工作程序,然后在两个程序中调用 MPI_reduce,以添加一些结果。出于某种原因,应用程序在 MPI_Comm_s
我是一名优秀的程序员,十分优秀!