2015-02-08 2 views
0

Каждый раз, когда я пытаюсь распечатать threadID, и независимо от того, где я поставил оператор печати, он всегда печатает threadId = 0. Похоже, что создается только один поток, но почему? Я не вижу, что я делаю неправильно. Кроме того, я проверил и num_t = 16. Я также убедился, что при компиляции я использую -fopenmp.Получение openmp для создания нескольких потоков

omp_set_num_threads(num_t); 
#pragma omp parallel shared(a,b,c) private(i,j,k) num_threads(num_t) 
{ 

    #pragma omp for schedule(static) 
    for (int i = 0; i < m; i++) 
    { 
     std::cout << omp_get_thread_num()<< "\n"; 
     for (int j = 0; (j < n); j++) 
     { 
      c[i + j*m] = 0.0; 
      for (int k = 0; k < q; k++) 
      { 
       c[i+j*m] += a[i*q + k]*b[j*q + k]; 
      } 
     } 
    } 
} 
+0

Вы просмотрели предупреждения компилятора (например, с помощью '-Wall')? Не игнорируется ли ваше прагматическое положение? Почему у вас есть обратная косая черта перед прагмой ('\ # прагма')? Какой размер 'm'? –

ответ

0

Чтобы проверить первый, я рекомендую вам использовать это:

#pragma omp parallel for private(...) shared(...) schedule(...) num_threads (X) 

, где «X» является количество создаваемых потоков. Теоретически предыдущая строка должна иметь аналогичный эффект для вас, но C++ иногда бывает придирчивым (особенно с предложением «parallel»)

Кстати, возможно, это не ваше дело, но будьте осторожны с помощью «текстовых клавиш» { }. Функциональность OpenMP может быть разной в зависимости от добавления их в блок кода или нет.

+0

Что вы подразумеваете под «текстовыми клавишами». Дополнительные скобки есть, потому что это внутри функции. Таким образом, есть и другие вне скобок. – user678392

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