Mon processeur est un Core i3 330M avec 2 coeurs et 4 threads. Quand j'exécute la commande cat /proc/cpuinfo
dans mon terminal, c'est comme si j'avais 4 CPUS. Lorsque j'utilise la fonction OpenMP get_omp_num_procs()
, j'obtiens également 4.OpenMP et cores/threads
Maintenant, j'ai une classe de vecteur C++ standard, je veux dire une classe de double tableau de taille fixe qui n'utilise pas de modèles d'expression. J'ai soigneusement parallélisé toutes les méthodes de ma classe et j'obtiens l'accélération "attendue". La question est: puis-je deviner l'accélération attendue dans un cas si simple? Par exemple, si j'ajoute deux vecteurs sans for-loops parallélisées, je reçois un peu de temps (en utilisant la commande shell time). Maintenant, si j'utilise OpenMP, devrais-je obtenir un temps divisé par 2 ou 4, selon le nombre de cœurs/threads? J'insiste sur le fait que je ne demande que ce simple problème particulier, où il n'y a pas d'interdépendance dans les données et où tout est linéaire (ajout de vecteurs).
Voici un code:
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;
}
J'ai déjà lu ce post: OpenMP thread mapping to physical cores.
J'espère que quelqu'un m'en dira plus sur la façon dont OpenMP fait le travail dans ce cas simple. Je devrais dire que je suis un débutant en informatique parallèle.
Merci!