MPI_Scatter 根进程退出并发出信号 (6)
MPI_Scatter root processus exit with signal (6)
我正在尝试读取图像 (.ras) 并将图像的一部分发送到每个进程。但是每次我得到
主要作业正常终止,但 1 个进程返回非零退出代码。根据用户指示,作业已中止。
mpirun 注意到节点 eskandarany 上 PID 为 0 的进程级别 0 在信号 6(中止)上退出。
这是我的代码:
typedef struct {
struct rasterfile file; ///< Entête image Sun Raster
unsigned char rouge[256],vert[256],bleu[256]; ///< Palette de couleur
unsigned char *data; ///< Pointeur vers l'image
} Raster;
int main(int argc, char *argv[]) {
Raster r;
int w, h, lh; /* nombre de lignes et de colonnes de l'image */
/* Variables liees au traitement de l'image */
int filtre; /* numero du filtre */
int nbiter; /* nombre d'iterations */
/* Variables liees au chronometrage */
double debut, fin;
/* Variables de boucle */
int i,j;
/* Nombres de processus */
int p, my_rank, tag = 0, root = 0;
MPI_Status status;
if (argc != 4) {
fprintf( stderr, usage, argv[0]);
return 1;
}
/* Saisie des paramètres */
filtre = atoi(argv[2]);
nbiter = atoi(argv[3]);
/* Initialisation */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
/* Lecture du fichier Raster */
if (my_rank == root) {
lire_rasterfile( argv[1], &r);
h = r.file.ras_height;
w = r.file.ras_width;
lh = (h/p) + 2;
}
MPI_Bcast(&w, 1, MPI_INT, root, MPI_COMM_WORLD);
MPI_Bcast(&lh, 1, MPI_INT, root, MPI_COMM_WORLD);
int shift = 0;
if (my_rank == 0 || my_rank == p-1) {
lh--;
shift = w;
}
unsigned char *bandlette = (unsigned char *) malloc(w * lh * sizeof(unsigned char));
MPI_Scatter(r.data, w*h, MPI_UNSIGNED_CHAR, bandlette + shift, w*lh, MPI_UNSIGNED_CHAR, root, MPI_COMM_WORLD);
printf("my rank is %i\n", my_rank);
free(bandlette);
free(r.data);
MPI_Finalize();
return 0;
} ```
问题是 MPI_Scatter 的第二个参数是要发送给每个进程的数据大小,而不是 send_buffer 的总大小。
所以在这种情况下它将是 w*h/p.
我正在尝试读取图像 (.ras) 并将图像的一部分发送到每个进程。但是每次我得到
主要作业正常终止,但 1 个进程返回非零退出代码。根据用户指示,作业已中止。 mpirun 注意到节点 eskandarany 上 PID 为 0 的进程级别 0 在信号 6(中止)上退出。
这是我的代码:
typedef struct {
struct rasterfile file; ///< Entête image Sun Raster
unsigned char rouge[256],vert[256],bleu[256]; ///< Palette de couleur
unsigned char *data; ///< Pointeur vers l'image
} Raster;
int main(int argc, char *argv[]) {
Raster r;
int w, h, lh; /* nombre de lignes et de colonnes de l'image */
/* Variables liees au traitement de l'image */
int filtre; /* numero du filtre */
int nbiter; /* nombre d'iterations */
/* Variables liees au chronometrage */
double debut, fin;
/* Variables de boucle */
int i,j;
/* Nombres de processus */
int p, my_rank, tag = 0, root = 0;
MPI_Status status;
if (argc != 4) {
fprintf( stderr, usage, argv[0]);
return 1;
}
/* Saisie des paramètres */
filtre = atoi(argv[2]);
nbiter = atoi(argv[3]);
/* Initialisation */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
/* Lecture du fichier Raster */
if (my_rank == root) {
lire_rasterfile( argv[1], &r);
h = r.file.ras_height;
w = r.file.ras_width;
lh = (h/p) + 2;
}
MPI_Bcast(&w, 1, MPI_INT, root, MPI_COMM_WORLD);
MPI_Bcast(&lh, 1, MPI_INT, root, MPI_COMM_WORLD);
int shift = 0;
if (my_rank == 0 || my_rank == p-1) {
lh--;
shift = w;
}
unsigned char *bandlette = (unsigned char *) malloc(w * lh * sizeof(unsigned char));
MPI_Scatter(r.data, w*h, MPI_UNSIGNED_CHAR, bandlette + shift, w*lh, MPI_UNSIGNED_CHAR, root, MPI_COMM_WORLD);
printf("my rank is %i\n", my_rank);
free(bandlette);
free(r.data);
MPI_Finalize();
return 0;
} ```
问题是 MPI_Scatter 的第二个参数是要发送给每个进程的数据大小,而不是 send_buffer 的总大小。 所以在这种情况下它将是 w*h/p.