Обмен данными в openmp

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

С уважением, -Мохд


person Mohd    schedule 09.09.2013    source источник
comment
Типы данных, объявленные вне параллельного блока, являются общими (если это не индекс в параллельном цикле), а те, что объявлены внутри параллельного блока, являются частными. См. мой ответ здесь   -  person Z boson    schedule 09.09.2013
comment
Отличная ссылка, спасибо, я хотел сделать многопоточность в своей программе, не сильно меняя код, похоже, это невозможно.   -  person Mohd    schedule 10.09.2013
comment
Опубликуйте код, который вы пытаетесь распараллелить (постарайтесь сделать его читабельным и не слишком длинным).   -  person Z boson    schedule 10.09.2013


Ответы (2)


Вы, вероятно, захотите взглянуть на локальное хранилище потоков.

person Paul Evans    schedule 09.09.2013

Вы можете, например:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) 
{
int nthreads, tid;

/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, tid)
  {

  /* Obtain thread number */
  tid = omp_get_thread_num();
  printf("Hello World from thread = %d\n", tid);

  /* Only master thread does this */
  if (tid == 0) 
    {
    nthreads = omp_get_num_threads();
    printf("Number of threads = %d\n", nthreads);
    }

  }  /* All threads join master thread and disband */

}

Однако вы не можете заменить общие данные асинхронными сообщениями, поскольку асинхронное выполнение задач openmp не гарантируется:

Правильно используйте потоки = изоляция + асинхронные сообщения

person cpp    schedule 09.09.2013
comment
Я хотел сделать это, не указывая, какие идентификаторы являются частными. Я ожидал, что для этого объявления (частных данных) доступна какая-то команда. - person Mohd; 09.09.2013
comment
Память можно объявить частной двумя способами. Второй — объявить переменную внутри цикла (т. е. внутри параллельной директивы OpenMP) без ключевого слова static. - person cpp; 09.09.2013
comment
можете ли вы прокомментировать, где находится nthreads? стек или куча? - person CKM; 05.11.2020