簡體   English   中英

將功能發送到MPI流程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM