Это простой тестовый код:OpenMP и Thread Local идентификатор хранилища с ICC
#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): error: "a" must be specified in a variable list at enclosing OpenMP parallel pragma #pragma omp parallel default(none)
Я не имею что парадигма (т.е. shared
, private
, threadprivate
) применима к этим типам переменных. Какой из них правильный?
Я получаю ожидаемое поведение при вызове функции, которая обращается к этой локальной переменной потока, но мне трудно получить доступ к ней из явного параллельного раздела.
Edit:
Мой лучшее решение до сих пор вернуть указатель на переменную с помощью функции
static inline int * get_a() { return &a; }
Смешивание различных моделей нитей, вероятно, не такая хорошая идея. Семантически 'threadprivate', вероятно, самый близкий. Поскольку '__thread' является расширением для компилятора, вы, вероятно, не найдете много документации, которая связывает это и OpenMP. –
Какой компилятор вы используете? GCC не должен просить вас предоставить 'a' явный класс совместного использования данных, даже если указан параметр' default (none) '. –
@HristoIliev Я использую 'icc' 12.0.2. И вы правы, что это, похоже, проблема с 'icc'. 'gcc' принимает это. –