2015-07-21 3 views
1

Сейчас я узнаю о параллельном программировании в C с openmp, и теперь я наткнулся на следующую проблему. У меня есть простой цикл, который я хочу распараллелить. Использование OpenMP, я думал, следующий код должен делать эту работуПараллельное программирование в C с openmp

unsigned long int teller_groot; 
int    boel = 0; 
int    k = 0; 
int    l = 1; 
unsigned long int sum2; 
int    thread_id; 
int    nloops; 

#pragma omp parallel private(thread_id, nloops) 
{ 
    sum2 = 0; 
    #pragma omp for 
     for (teller_groot=1000000; teller_groot<1000000000000; teller_groot++) 
     { 
      boel = 0; 
      for (int i = 0; i < 78498; i++) 
      { 
       if (floor(teller_groot/array[i]) == teller_groot/array[i])      
       { 
        boel = 1; 
        break; 
       } 
      } 

      if (boel == 0) 
      { 
       sum2 = sum2 + teller_groot; 
      } 

      if (sum2 >= 1000000000) 
      { 
       sum2 = sum2 - 1000000000; 
      } 

      if (k == 10000000) 
      { 
       printf("%d, ", l); 
       l++; 
       k = 0; 
      } 

      k++; 
     } 

     thread_id = omp_get_thread_num(); 

     printf("Thread %d performed %d iterations of the loop.\n", thread_id, nloops); 
} 

Код

if (k == 10000000) 
{ 
    printf("%d, ",l); 
    l++; 
    k = 0; 
} 

k++; 

только для меня, чтобы знать, как далеко в цикле мы. Если я запускаю программу, она ничего не печатает, то есть ничего не вычисляет. Что не так с кодом тогда? Благодарю.

+0

Исправьте углубление и используйте пустое пространство; это выглядит очень плохо! –

+0

@ смысл-дела извините, LPs отредактировал, поэтому я надеюсь, что теперь он выглядит нормально. – Badshah

+0

Выполняется ли последний 'printf'? – LPs

ответ

1

Вы указали переменную k (помимо прочего) вне цикла openmp for. Когда переменные объявляются вне параллельных областей, по умолчанию они разделяют область видимости. Это означает, что все используемые вами потоки будут проверять и записывать одну и ту же переменную k, что может привести к условиям гонки.

Если вы хотите написать одну и ту же переменную k с различными потоками, вы можете использовать блокировки или атомарные обновления для получения желаемого поведения.

В противном случае, объявить k как частной переменной в #pragma заявлении в начале параллельной области:

#pragma omp parallel private(thread_id, nloops, k) 

Хороший праймер доступен здесь: http://supercomputingblog.com/openmp/tutorial-parallel-for-loops-with-openmp/

+0

Я сделал все переменные private (также k), но он все равно ничего не делает. Ты знаешь почему? – Badshah

1

Я не хватает репутации комментировать, поэтому я пишу ответ.

Какая часть вашего кода точно застревает? (По застрял мы подразумеваем, что занимает очень много времени?)

потому что:

  if (floor(teller_groot/array[i]) == teller_groot/array[i])      
      { 
       boel = 1; 
       break; 
      } 

Что вы делаете это пол результат (позволяет сказать, чтобы сделать его простым) 22/41 = 0.536 to => 0.5, а затем проверить, равен ли 0.536 == 0.5, и это не так, поэтому команда break может не выполняться в зависимости от того, что находится в массиве, который вы не указали.

Кроме того, многие из ваших переменных являются общими, включая массив, которые могли бы изменить ситуацию, а также и переменной nloops не определен (если где-то выше кода вы не показан)

проверки это PDF о OpenMP: http://openmp.org/mp-documents/OpenMP4.0.0.Examples.pdf

EDIT: кстати, попробуйте очистки буфера после Е(): fflush (стандартный вывод)

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