Không thể sử dụng fork()
vì quá trình con sẽ không thể sử dụng chức năng MPI. Có một cơ chế đơn giản trong MPI để tạo các tiến trình động mới. Bạn phải sử dụng chức năng MPI_Comm_spawn
hoặc MPI_Comm_spawn_mutliple
OpenMPI doc: http://www.open-mpi.org/doc/v1.4/man3/MPI_Comm_spawn.3.php
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#define NUM_SPAWNS 2
int main(int argc, char *argv[])
{
int np = NUM_SPAWNS;
int errcodes[NUM_SPAWNS];
MPI_Comm parentcomm, intercomm;
MPI_Init(&argc, &argv);
MPI_Comm_get_parent(&parentcomm);
if (parentcomm == MPI_COMM_NULL) {
MPI_Comm_spawn("spawn_example", MPI_ARGV_NULL, np, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &intercomm, errcodes);
printf("I'm the parent.\n");
} else {
printf("I'm the spawned.\n");
}
fflush(stdout);
MPI_Finalize();
return 0;
}
Nguồn
2014-04-30 12:52:44
tôi giới thiệu bạn đến câu trả lời của tôi để [câu hỏi này] [1]. [1]: http://stackoverflow.com/questions/9683331/changing-number-of-processors-during-execution-of-the-code-in-mpis-based-paralle/9683758# 9683758 –
@HighPerformanceMark: Nhưng điều đó chỉ bắt đầu một quy trình mới. Đây không chính xác là một bản sao viết 'fork' từ vị trí chính xác (và cấu hình) của quá trình hiện tại. – bitmask
bạn hỏi 'là cái gì đó hoặc tương tự có thể?', Tôi đề nghị rằng mph_comm_spawn là tương tự. Nhưng nếu nó không phù hợp với yêu cầu của bạn, bạn có thể bị bỏ lại với việc phải viết lại MPI. Hoặc sử dụng một thư viện parallelisation/toolset/phương pháp tiếp cận khác. –