2013-07-09 3 views
1

Я написал программу, которая ищет элемент в целочисленном массиве 100000000 и инициализирует его i + 1 (i - это индекс элемента). Теперь в этом я ищу 73500320 и обновляет integer 'me' до 1, если он найден, 'me' был инициализирован -1. Но когда я напечатать меня, иногда печатает, как -1, а иногда 1. (Он всегда должен быть найден!) Я не могу понять ошибку ...Неверный ответ openMP-кода в c

#pragma omp parallel 
{ 
    int thread = omp_get_thread_num(); 
    int num_thread=omp_get_num_threads(); 
    int beginpos = (thread + 0) * (100000000/num_thread); 
    int endpos = (thread + 1) * (100000000/num_thread); 
    for (i = beginpos; i < endpos; i++) 
    { 
     #pragma omp flush(done) 
     if (done == 1) 
     { 
      break; 
     } 

     if (a[i] == 73500320) 
     { 
      /* Inform the other threads that we found the element. */ 
      done = 1; 
      #pragma omp flush(done) 
      me = 1; 
      break; 
     } 
    } 
} 
+0

хорошо вы сообщить другой поток, сделанный изменила, но вы должны зафиксировать вокруг «каждого чтения/write of "done" – alexbuisson

+0

Этот код нигде не устанавливает 'me' в' -1'. –

+0

согласен, но это может быть объяснено, потому что вы установили и уведомили об этом, прежде чем установить меня в 1. Я не могу проверить сейчас, поэтому я не буду отвечать, но попытаюсь установить «я» до «сделано» – alexbuisson

ответ

0

как заявление перерыва действительно не то, что вы можете использовать в открытом цикле МП, рассмотрим следующий код

это использовать статический график OpenMP (по аналогии с логикой вы добавили в начале вашего параллельного региона.

поэтому я неявно частное, меня и я делаю это явно, и я согласен с тем, что все потоки должны закончить работу и не могут выйти раньше, но на VS'2012, например, если я попытаюсь переломить [Параллельный цикл] построения я получаю «ошибка C3010:„перерыв“: прыжок из OpenMP структурированного блока не допускается»

#pragma omp parallel for shared(me, done) 
for (int i = 0; i < 100000000; i++) 
{ 
    if (done == -1) 
    { 
    if (a[i] == 73500320) 
    { 
     cout << "thread " << omp_get_thread_num() << " found at i=" << i << endl; 
     me = 1; 
     done = 1;   
    } 
    } 
} 

cout << me << endl; 
+0

Да, это правильно, но проблема в том, что цикл не останавливается, если элемент найден ... Я хочу остановить цикл, как только элемент будет найден ... – enigma

+0

, но вы не можете .... OpenMP spec ясно, вы не можете иметь другую точку выхода, чем закрывающая скобка. Поэтому, если вы выражаете проблему с помощью «Я бы распараллеливал/разделял первую задачу поиска и выдавал результат, тем скорее« OpenMP может это сделать, но вам нужно использовать конструкцию задачи ». – alexbuisson

Смежные вопросы