[英]Send a function to MPI processes
我目前正在為分布式系統編寫運行時系統軟件,然后打算評估一些並行管理方面的知識。 像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。 您有解決我問題的想法嗎?
謝謝 !
正如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,則返回的句柄用於主程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.