2012-03-14 38 views
5

Nếu tôi sử dụng MPI, tôi có một số quy trình được chỉ định khi tôi chạy chương trình chính. Tuy nhiên tôi muốn bắt đầu với một quá trình và tự động quyết định khi chạy nếu và khi tôi cần nhiều hơn, để chia nhỏ thêm các quy trình. Điều đó hay cái gì đó tương tự có thể?Tạo quy trình MPI khi đang di chuyển bằng nĩa?

Nếu không, tôi sẽ phải phát minh lại MPI mà tôi rất muốn tránh.

+2

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 –

+0

@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

+0

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. –

Trả lời

7

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; 
} 
Các vấn đề liên quan