OpenMPIとOpenMPのhybrid実行では必ず指定しなければいけないオプションがあります。指定しないと、計算時間が何倍にも増えてしまいます(OpenMPI v1.10.1辺の場合)。例えばIntel Xeon E5-2697v3が2CPUのコンピュータで2CPU間はMPIで並列、CPU内はOpenMPで並列する、2プロセス、各プロセス14スレッドの実行は
mpirun -np 2 -x OMP_NUM_THREADS=14 program
とすればよさそうですがそれではうまくいきません。
mpirunはプロセス数(-np)が2以下の場合-bind-to coreというオプションを自動的に使うようになっているからです(openmpi-1.10.1辺の場合)。mpirunによって2つのプロセスが2つのコア上で実行開始し、それぞれのプロセスがOpenMPで14スレッド並列実行をします。ところが-bind-to coreが指定されているので、14スレッドはそれぞれのコアの外に出ることができず、14スレッドだけれども、1コア上で実行してしまいます。topコマンドなどでコアの使用状況を見ていればおかしいとわかりますが、そうでない場合どうしてこんなに遅いのかと思ってしまうことでしょう。OpenMPIのどこかのバージョンでこの仕様に変更されたようですが、極めて使いにくい仕様のような気がします。
-bind-toの後にはcore、socket、nodeなどが指定できます。socketはCPU、nodeは1台のコンピュータのことです。mpirunのオプション無しだとうまくいかないことがわかりましたので、-bind-to socketを使って
mpirun -np 2 -bind-to socket -x OMP_NUM_THREADS=14 program
としてみます。すると片側のCPUの2つのコア上で2つのプロセスの実行が始まりそれぞれが14スレッドに分かれますが-bind-to socketなので1個のCPU上で28スレッドが実行されて、これまたうまくいきません。
これを解決するのが-npersocket 1オプションです。これは見ての通りmpiのプロセスを1CPU上では1つしか走らせないようにするオプションです。これを加えて
mpirun -np 2 -bind-to socket -npersocket 1 -x OMP_NUM_THREADS=14 program
とすると、期待通りの動作をするようになり、計算時間が最短になります。
つまりOpenMPIとOpenMPのhybrid実行では、-bind-to socket -npersocket 1が必須ということです(1CPUあたり1プロセスで、openmpi-1.10.1辺りの場合)。

mpirunの-xオプションについてはこちらをご覧ください。