VC++雑談ープロセッサアフィニティとOpenMP実行ライブラリの不和???
今回はそれをお伝えするピヨ。
OpenMPには、呼び出された時点でプログラムが利用可能なプロセッサ数を返す実行時ライブラリomp_get_num_procsが規定されているピヨ。この関数の説明を読んだボクは一つの疑問が脳裏に浮かんだピヨ。
じゃあ、現在使用可能なCPUという事は、ハードアフィニティを使って、そのプログラムで利用可能なCPUを一つに制限すれば、関数の戻り値が1になるのかなって。
という事で、VC++2008で実際に試したピョッ♪
#include
#include
#include
#include
int main(void)
{
printf( "現時点で利用可能なプロセッサ数は%dです。\n",
omp_get_num_procs() );
SetProcessAffinityMask( GetCurrentProcess(), 3 );
Sleep( 1000 ); //念のために待つ
printf( "現時点で利用可能なプロセッサ数は%dです。\n",
omp_get_num_procs() );
printf( "\n" );
return 0;
}
よし!これで2回目の実行は1を返すはずピヨ。・・・あれ??2が返ってきたピヨォ。
現在利用可能って事は、1つのCPUにハードアフィニティしたプログラムは1を返さないとおかしいよね?
う~ん、ハードアフィニティを使用したら指定したCPUでのみ実行されるはずピヨ。
何か設定が間違っているのかもしれないから、試しにこのプログラムに無限ループを埋め込んでタスクマネージャでCPUの利用率を確認したけど、やっぱりCPU1でコードが実行されていたピヨ。という事は、確実にCPU1でしかプログラムが動かないって事だから・・・
この状況で使用できない関数に何の意味があるんだろう。どうやったら戻り値が変化するのかな?
この動作、将来のヴァージョンで見直されるといいな♪
もしかしたらこの関数、物理的に使用できるCPUの数を返すのかもしれないけど、アフィニティも考慮してくれなきゃ使いにくいピヨォ。
アフィニティも考慮して、現在利用可能なCPUが返ってきたら便利だと思うピヨ♪