2

OpenMPによって作成されたスレッドを破棄することは可能ですか?プログラムが起動すると、スレッドは1つだけになります。並列化されたセクションの後、スレッドプールがあるため、複数のスレッドが残ります。並列セクションの実行後にこのプールを破棄する方法はありますか?

ダイナミックライブラリでOpenMPを使用していて、スレッドの実行中にライブラリハンドルを閉じることができないため、質問します(プログラムはセグメンテーション違反になります)。

ありがとう

詳細説明: すべての並列化コードをモジュール(共有ライブラリ)に入れています。次に、モジュールをロードして、抽象基本クラスから派生したクラスを渡します。次に、モジュールはそのクラスを並行して「実行」します。このように、並列化、OpenMP、MPIなどを使用できず、実行時またはオンザフライで並列スキームを変更できます。しかし、OpenMPはスレッドを破棄しません。また、ライブラリを手動でdlcloseする場合、リソースがスレッドの下から破棄されるため、セグメンテーションフォールトが発生します(私は信じています)。ライブラリを閉じずにプログラムを終了させることはおそらく今のところ問題ありませんが、ライブラリを手動で閉じたいと思うことは将来も起こるかもしれません(その場でスキームを変更することを考えてください)。これが理にかなっていることを願っています:)ありがとう

4

1 に答える 1

3

現時点では、OpenMP仕様では、スレッドが破棄されるタイミングを制御する機能はユーザーに提供されていません。あなたが言っていることは非常に興味深いものであり、仕様について議論するためのOpenMP言語委員会の会議では取り上げられていません。あなたがしていることと問題が何であるかについてもっと情報を与えることができますか?この議論を委員会に持ち込むのに役立つでしょう。

編集追加3/7-

わかりました-これはうまくいくように見える簡単な例であり、問​​題を回避できる可能性があります:

$> cat prog.c  
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main(void)
{
  void (*f)(void);
  void *handle;

  handle = dlopen("./shared.so", RTLD_NOW);
  if (!handle) {
    printf("*** dlopen error - %s\n", dlerror());
    abort();
  }

  f = dlsym(handle, "foo");
  if (!f) {
    printf("*** dlsym error - %s\n", dlerror());
    abort();
  }
  f();

  if(dlclose(handle)) {
    printf("*** dlclose error - %s\n", dlerror());
    abort();
  }
  return 0;
}

$> cat shared.c 
#include <omp.h> 
#include <stdio.h>

void foo(void)
{
  int i;

  puts("... in foo\n");

  #pragma omp parallel for
  for (i=0; i<10; i++) 
    printf("t#: %i  i: %i\n", omp_get_thread_num(), i);

  puts("... exiting foo");
}

$> gcc -rdynamic -fopenmp prog.c -ldl -o prog                                                                   
$> gcc -c -fopenmp -fPIC -o shared.o shared.c                                                                 
$> ld -shared -o shared.so shared.o                                                                           
$> ./prog
... in foo

t#: 2  i: 4
t#: 2  i: 5
t#: 3  i: 6
t#: 3  i: 7
t#: 0  i: 0
t#: 0  i: 1
t#: 4  i: 8
t#: 4  i: 9
t#: 1  i: 2
t#: 1  i: 3
... exiting foo

メインプログラム(prog.c)にはOpenMPコードはありませんが、-fopenmpフラグを使用してコンパイルしました。これは、実際にOpenMPを使用している共有ライブラリを呼び出す前にOpenMP環境がセットアップされることを意味します。環境はまだそこにあるので、これはdlcloseを実行する際の問題を回避するようです。また、OpenMPを最初に使用して取得したスレッドを、その後の使用のために残しておくこともできます。これは問題を回避するために機能しますか(またはこれはこの単純な例でのみ機能しますか)?

于 2011-03-05T01:31:45.807 に答える