8
votes

Essayer de savoir pourquoi le code OpenMP ne parle pas

J'ai juste commencé à apprendre à utiliser OpenMP . J'essaie de comprendre pourquoi le code suivant ne fonctionne pas en parallèle avec Visual Studio 2008. Il compile et fonctionne bien. Cependant, il n'utilise qu'un seul noyau sur ma machine à quad à quad. Cela fait partie du code que j'essaie de porter sur un MATLAB Fonction MEX. Tout pointeur est apprécié.

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v)
for(t = 0; t<T; t++)
{
    dz = aRNG->randn();
    v += mrdt* (tv - v) +
         vv_v_sqrt_dt * dz +
         vv_vv_v_dt*(dz*dz - 1.);

    sum_v += v;
    if(t == ts_count-1)
    {
        int_v->at_w(k++) = sum_v/(double)(t+1);
        ts_count += ts;
    }
}


0 commentaires

3 Réponses :


0
votes

Je ne suis pas trop sûr, ça fait longtemps que j'ai utilisé OpenMP, mais vous avez la variable de boucle Té comme privé. Est-ce que c'est ce que tu veux? N'est-ce pas la variable de parallélisation?


0 commentaires

0
votes

Une possibilité est que vous utilisez la variable "Sum_V". Étant donné que vous effectuez une réduction, le runtime attend probablement probablement de n'accumuler que des valeurs là-bas et d'y accéder, ce n'est normalement qu'après la fin de la boucle.


0 commentaires

5
votes

La variable V est calculée à l'aide de la valeur V de l'itération précédente xxx

Vous ne pouvez pas faire cela, il casse le parallélisme. La boucle doit pouvoir être exécutée dans n'importe quelle séquence ou avec des morceaux parallèles différents à la fois, sans effets secondaires. D'un premier coup d'œil, il ne semble pas que vous puissiez parlementer ce genre de boucle.


1 commentaires

Vous devez également examiner votre SE d'un générateur de nombres aléatoires au sein de la boucle. Selon la mise en œuvre, cela peut verrouiller une ressource partagée, sérialisant efficacement votre code après si vous avez répondu au problème ci-dessus.