Это простой тестовый код:
#include <stdlib.h>
__thread int a = 0;
int main() {
#pragma omp parallel default(none)
{
a = 1;
}
return 0;
}
gcc
компилирует это без проблем с -fopenmp
, но icc (ICC) 12.0.2 20110112
с -openmp
жалуется на
test.c (7): ошибка: необходимо указать "a" в списке переменных при включении прагмы OpenMP parallel #pragma omp parallel default (нет)
Я понятия не имею, какая парадигма (например, shared
, private
, threadprivate
) применима к этому типу переменных. Какой из них лучше использовать?
Я получаю ожидаемое поведение при вызове функции, которая обращается к этой локальной переменной потока, но у меня проблемы с доступом к ней из явного параллельного раздела.
Изменить:
На данный момент мое лучшее решение - вернуть указатель на переменную через функцию
static inline int * get_a() { return &a; }
threadprivate
, вероятно, наиболее близок. Поскольку__thread
является расширением компилятора, вы, вероятно, не найдете много документации, которая связывает это и OpenMP. - person Jens Gustedt   schedule 14.11.2013a
явный класс совместного использования данных, даже если указанdefault(none)
. - person Hristo Iliev   schedule 14.11.2013icc
12.0.2. И вы правы, что это похоже на проблему сicc
.gcc
принимает это. - person Sergey L.   schedule 15.11.2013#pragma omp threadprivate(a)
в следующую строку после объявленияa
. Это немного тавтология, поскольку в значительной степени оба делают одно и то же (за некоторыми исключительными случаями, касающимися объектов C ++). - person Hristo Iliev   schedule 15.11.2013__thread
и установка вместо него#pragma omp threadprivate
даже делает мой код совместимым с Mach-O, поскольку__thread
не поддерживается в исполняемых файлах Mach-O. Если вы опубликуете это как ответ, я с радостью отдаю вам должное. - person Sergey L.   schedule 15.11.2013