2015-08-07 3 views
0

У меня проблема с распределением задач в OpenMP. У меня есть следующий код:OpenMP scheduler

#include <stdio.h> 
#include <unistd.h> 

int cnttotal = 0; 
int cnt1 = 0, cnt2 = 0; 

int main() 
{ 
    int i; 
    #pragma omp parallel 
    #pragma omp single nowait 
    for (i = 0; i < 60; i++) { 
     if (cnttotal < 1) { 
      cnttotal++; 
      #pragma omp task 
      { 
       #pragma omp atomic 
       cnt1++; 
       usleep(10); 
       cnttotal--; 
      } 
     } else { 
      #pragma omp task 
      { 
       #pragma omp atomic 
       cnt2++; 
       sleep(1); 
      } 
     } 
    } 

printf("cnt1 = %d; cnt2 = %d\n", cnt1, cnt2); 

    return 0; 
} 

Что бы я не сделал, cnt1 = 1, cnt2 = 59. Я думаю, что проблема в планировщике OpenMP. Или есть что-то не поймать.

+0

Пожалуйста, объясните, что вы хотите, чтобы ваш код выполнял и что конкретно ваш вопрос. Прямо сейчас, я понятия не имею, о чем вы спрашиваете ... – NoseKnowsAll

ответ

1

Мое ощущение, что вы путаете создание задачи с фактическим выполнением задачи. Задача #pragma omp относится к мгновению задачи, и это очень быстро. Другое дело, что пустой поток среды OpenMP ищет список готовых задач и выполняет его.

Входит в проблему, которую вы опубликовали. В этом коде работает текущий поток (скажем, T1), входящий в первую итерацию (i = 0), поэтому он входит в первый, если и затем устанавливает cnttotal в 1 и создает первую задачу (cnt1). После этого экземпляра T1 сохраняет экземпляры оставшихся задач, в то время как незанятый поток (скажем, T2) выполняет задачу cnt1, которая принимает приблизительно 10us и снова устанавливает cnttotal в 0.

Итак, вкратце, что происходит, когда поток, который создает любую задачу, выполняется быстрее, чем те 10us в задаче cnt1.

Например, в моем процессоре Intel (R) Core i7-2760QM с частотой 2.40 ГГц, если я изменил код так, чтобы цикл работал до i = 500 и спал 1 us (usleep (1)), я получаю :

cnt1 = 2; cnt2 = 498

, который показывает, что выполнение задач очень быстро.

+1

Есть хорошее описание задач openmp в http://stackoverflow.com/questions/13788638/difference-between-section-and-task-openmp – Harald