私のCPUはコア2個とスレッド4個のCore i3 330Mです。私の端末にcat /proc/cpuinfo
というコマンドを実行すると、私は4 CPUSを持っているようです。 OpenMP関数を使用すると、get_omp_num_procs()
も得られます。OpenMPとコア/スレッド
標準のC++ベクタークラスがあります。これは、式テンプレートを使用しない固定サイズの2倍配列クラスを意味します。クラスのすべてのメソッドを慎重に並列化して、「期待される」スピードアップを得ました。
問題は次のとおりです。このような単純なケースでは、予想されるスピードアップを推測できますか?たとえば、並列化されたfor-loopsなしで2つのベクトルを追加すると、(shell 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がどのように仕事をするのか、誰かがもっと教えてくれることを願っています。私は並列計算の初心者だと言わなければならない。
ありがとうございます!