S'il vous plaît jeter un oeil à l'extrait de code suivant à l'aide OpenMP pour la parallélisation:La mise en œuvre spinlocks à synchroniser les threads OpenMP en utilisant intrinsics compilateur
char lock = 0;
#pragma omp parallel
{
while(!__sync_bool_compare_and_swap(&lock, 0, 1));
printf("Thread: %d is working!\n", omp_get_thread_num());
sleep(1);
printf("Thread: %d unlocks lock!\n", omp_get_thread_num());
lock = 0;
}
Est-il possible que les discussions bloquent simultanément le verrou, même si le verrouillage est atomique avec __sync_bool_compare_and_swap? Par exemple, tous les threads n'ont-ils pas une vue cohérente de la mémoire?
Alors que '__sync _ *()' est une barrière complète, 'lock = 0;' ne l'est pas. – EOF
Pourquoi voudriez-vous faire ça? OpenMP est exactement conçu pour fournir des abstractions appropriées, par ex. '#pragma omp crtical' dans votre cas. De la [description de '__sync_bool_compare_and_swap'] (https://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html), je suppose fortement que les barrières de la mémoire sont utilisées pour imposer une cohérence vue de la mémoire. Mais comme remarqué par EOF, le 'lock = 0;' peut être un problème dû à la réorganisation. – Zulan
Alors que je suis entièrement d'accord avec vous, je travaille actuellement avec du code que je n'ai pas écrit et dans ce code, la synchronisation est renforcée comme je l'ai présenté dans le code. Et Intel Inspector détecte les conditions de course, ce qui ne devrait pas être possible si la synchronisation fonctionne comme je le souhaite. –