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; } }
3 Réponses :
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? P>
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. p>
La variable V est calculée à l'aide de la valeur V de l'itération précédente 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. P> p>
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.