2012-03-14 14 views
5

MPI kullanırsam, ana programı çalıştırdığımda belirtilen bir dizi işlem var. Ancak bir süreçle başlamak istiyorum ve daha fazla işleme ihtiyaç duyduğumda ve daha fazla işleme ihtiyaç duyduğumda, çalışma zamanına dinamik olarak karar vermek istiyorum. Bu veya benzer bir şey mümkün mü? Aksi takdirde, kaçınmak istediğim MPI'yi yeniden icat etmek zorunda kalırdım.MPI süreçlerini çatalla anında mı yaratıyorsunuz?

+2

[1]: Sen MPI_Comm_spawn fonksiyonunu veya MPI_Comm_spawn_mutliple

OpenMPI doc kullanmalıdır. [1]: http://stackoverflow.com/questions/9683331/changing-number-of-processors-during-execution-of-the-code-in-mpis-based-paralle/9683758# 9683758 –

+0

@HighPerformanceMark: Ama bu sadece yeni bir süreç başlatıyor. Bu, tam olarak geçerli işlemin kesin konumundan (ve yapılandırılmasından) 'fork' yazan bir kopya değildir. – bitmask

+0

'Bu ya da benzer bir şey mi?' Sordu, ben mph_comm_spawn benzer olduğunu öneriyorum. Ancak gereksinimleriniz için uygun değilse, MPI'yi yeniden yazmak zorunda kalabilirsiniz. Ya da başka bir paralelleştirme kütüphanesi/araç seti/yaklaşımı kullanın. –

cevap

7

Çocuk işlemi MPI işlevlerini kullanamadığından fork() kullanmak mümkün değildir. MPI'de dinamik olarak yeni süreçler oluşturmak için basit bir mekanizma var. Ben [Bu soruya] cevabım sevk 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; 
}