В настоящее время я пишу системное программное обеспечение для распределенных систем, а затем я намерен оценить некоторые вещи для параллельного управления. Я полагался в своих системах выполнения на модель программирования задач, как в стандарте OpenMP3.0, но для другой категории машин с MPI.
Для этого я создаю несколько MPI-процессов (по одному на машину) и запускаю на нем несколько потоков. Существует один главный процесс, который отвечает за создание новых задач для других процессов, и ему необходимо отправить некоторую работу для выполнения. Каждая задача содержит указатель на функцию (необходимая работа) и набор аргументов, передаваемых этой функции. Что-то вроде этого:
class Task
{
public:
typdef struct
{
// ... Storing and packing arguments
} args_t;
Task();
~Task();
void exec()
{
// Executing the function pointed by "func_ptr"
// with the specified arguments in "args"
func_ptr( args );
}
private:
void (*func_ptr)(args_t);
args_t args;
};
Для передачи аргументов я буду использовать функции MPI_Type_create_struct. Однако теперь моя проблема: как отправить функцию другому процессу MPI? Если я отправлю функцию указателя, она больше не будет действительна в адресном пространстве получателя процесса MPI. Поскольку я не могу знать количество различных типов задач, которые у меня будут, это добавляет еще одну трудность, потому что я не могу создать соответствующую карту и просто отправить уникальный идентификатор в процесс MPI. У вас есть идеи, как решить мою проблему?
Спасибо !
MPI_Comm_spawnиMPI_Comm_spawn_multiple, если это то, что вы имели в виду, запуская «подпрограмму». - person ggulgulia   schedule 17.07.2018dlsym(), чтобы найти ее адрес. - person Gilles Gouaillardet   schedule 17.07.2018dlopen()иdlsym()для получения имени функции. - person Gilles Gouaillardet   schedule 17.07.2018