私のCPUは2コア4スレッドのCore i3 330Mです。端末でコマンド cat を実行すると、/proc/cpuinfo
4 つの CPU があるように見えます。OpenMP 関数を使用すると、get_omp_num_procs()
4 も取得されます。
これで、標準の C++ ベクトル クラスができました。これは、式テンプレートを使用しない固定サイズの double 配列クラスを意味します。クラスのすべてのメソッドを慎重に並列化したところ、「期待される」スピードアップが得られました。
問題は、このような単純なケースで期待されるスピードアップを推測できるかどうかです。たとえば、並列化された for ループを使用せずに 2 つのベクトルを追加すると、(シェルの time コマンドを使用して) ある程度の時間が得られます。OpenMP を使用する場合、コア/スレッドの数に応じて、時間を 2 または 4 で割った値を取得する必要がありますか? データに相互依存性がなく、すべてが線形 (ベクトル加算) である、この特定の単純な問題のみを求めていることを強調します。
ここにいくつかのコードがあります:
Vector Vector::operator+(const Vector& rhs) const
{
assert(m_size == rhs.m_size);
Vector result(m_size);
#pragma omp parallel for schedule(static)
for (unsigned int i = 0; i < m_size; i++)
result.m_data[i] = m_data[i]+rhs.m_data[i];
return result;
}
私はすでにこの投稿を読みました: OpenMP thread mapping to physical cores .
この単純なケースで OpenMP がどのように機能するかについて、誰かが詳しく教えてくれることを願っています。私は並列計算の初心者です。
ありがとう!