現在、MPIでプロセスが現在実行されているプロセッサのコアIDを知る必要があるプロジェクトに取り組んでいますか?MPIには、MPI_Get_processor_name(char * name、int * resultlen)という関数があります。これは、プロセスが実行されているノードの名前のみを示します。実行されているコアのIDを知りたいですか?出来ますか?もしそうなら、誰かが私にそれを行うためのコードスニペットを与えることができますか?
ありがとうございました
現在、MPIでプロセスが現在実行されているプロセッサのコアIDを知る必要があるプロジェクトに取り組んでいますか?MPIには、MPI_Get_processor_name(char * name、int * resultlen)という関数があります。これは、プロセスが実行されているノードの名前のみを示します。実行されているコアのIDを知りたいですか?出来ますか?もしそうなら、誰かが私にそれを行うためのコードスニペットを与えることができますか?
ありがとうございました
これは、それらがバインドされている各プロセスのコアIDを与えるコードです。これには、前の回答のコメントでHristoIlievが提案したhwlocライブラリが必要です。
#include <stdio.h>
#include "mpi.h"
#include <hwloc.h>
int main(int argc, char* argv[])
{
int rank, size;
cpu_set_t mask;
long num;
int proc_num(long num);
hwloc_topology_t topology;
hwloc_cpuset_t cpuset;
hwloc_obj_t obj;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
hwloc_topology_init ( &topology);
hwloc_topology_load ( topology);
hwloc_bitmap_t set = hwloc_bitmap_alloc();
hwloc_obj_t pu;
int err;
err = hwloc_get_proc_cpubind(topology, getpid(), set, HWLOC_CPUBIND_PROCESS);
if (err) {
printf ("Error Cannot find\n"), exit(1);
}
pu = hwloc_get_pu_obj_by_os_index(topology, hwloc_bitmap_first(set));
printf ("Hello World, I am %d and pid: %d coreid:%d\n",rank,getpid(),hwloc_bitmap_first(set));
int my_coreid = hwloc_bitmap_first(set);
int all_coreid[size];
hwloc_bitmap_free(set);
hwloc_topology_destroy(topology);
MPI_Finalize();
return 0;
}
あなたの質問は、各MPIプロセスが単一のCPUコアにバインドされて実行されることを前提としています。これは、多くのクラスターMPI実装のデフォルトの動作ではありません。たとえば、Open MPIには必要なバインディング機構がありますが、--bind-to-core
or--bind-to-socket
オプションを使用して明示的に有効にする必要があります。一方、最新のIntel MPIバージョンでは、パフォーマンス上の理由から、デフォルトでバインディングが有効になっています。その不一致のため、ほとんどのクラスターMPI実装MPI_GET_PROCESSOR_NAME
では、一般的なケースでは特定のプロセッサーを識別できないため、実行ノードのホスト名を返すだけです。
各プロセスがコアにバインドされて実行される場合、通常、プロセスのアフィニティマスクを読み取ることでバインドを取得できます。これはOSに依存しますが、それを抽象化できるライブラリがあります。たとえば、hwlocライブラリ(Open MPIの一部ですが、完全に別個のプロジェクトとして開発されているため、単独で使用できます)。一般的なケースでは、アフィニティマスクの読み取りも可能です。プロセスがバインドされていない場合、アフィニティマスクは、システムのアフィニティマスクと単純に一致します(つまり、すべてのプロセッサで実行が許可されます)。
IBM Blue Geneのように、バインディングがシステムハードウェアの一部として機能するプラットフォームがあります。そこで、各MPIプロセスは、十分に識別可能な唯一のプロセッサで実行されMPI_Get_processor_name
、各呼び出しプロセスで一意の文字列値を返します。