我目前正在为分布式系统编写运行时系统软件,然后打算评估一些并行管理方面的知识。与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进程发送唯一的ID。 您有解决我问题的想法吗?
谢谢!
答案 0 :(得分:0)
正如Gilles Gouillardet所建议的那样,我试图通过使用dlopen()和dlsym()函数来解决此问题。 我尝试了一个小程序来找到一个指向helloWorld函数的指针:
#include <dlfcn.h>
#include <iostream>
void helloWorld(void)
{
std::cout << "Hello World !" << std::endl;
}
int main(int argc, char** argv)
{
void *handle;
void (*task)(void);
char* error;
handle = dlopen(NULL, RTLD_LAZY);
if(!handle)
{
fprintf(stderr, "dlopen error: %s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror();
*(void **) (&task) = dlsym(handle, "helloWorld");
if( (error = dlerror()) != NULL)
{
fprintf(stderr, "dlsym error: %s\n", dlerror());
exit(EXIT_FAILURE);
}
dlclose(handle);
return EXIT_SUCCESS;
}
但是,函数dlsym无法找到helloWorld函数,并返回错误消息:
dlsym error: (null)
我现在不尝试找到解决此问题的方法,但是我正在寻找它。 如果有人对dlsymp功能有任何经验,请与我分享您的经验。
编辑:感谢dlopen手册页(https://linux.die.net/man/3/dlsym)的指定,我将NULL传递给dlopen:
函数dlopen()加载以空字符串结尾的文件名命名的动态库文件,并为动态库返回一个不透明的“句柄”。如果filename为NULL,则返回的句柄用于主程序。