OpenMP и C++ class members

Что-то у меня затык и гугление не помогает.

class Bar
{
public:
    int  a;
    Bar();
    void run(void);
};

void Bar::run(void)
{
    int i,k;
#pragma omp parallel private(i) firstprivate(k,a)
    {
    }
}

Ругается вот таким нехорошим словом:
omp-test.cpp: In member function 'void Bar::run()':
omp-test.cpp:22: error: 'Bar::a' is not a variable in clause 'firstprivate'

Ну и что с этим делать?

Update Нашел (тоже не очень легко), что возможен такой синтаксис:

class Bar
{
public:
    int  a;
#pragma omp firstprivate(a)
}
А что делать, если Bar::a в одном месте должна быть lastprivate, а в другом - reduction? Временные переменные заводить?

Comments

для ООП в C++ вместо OMP советую юзать Intel TBB

Ну у меня задача - получить portable-код (gcc/VS2005)....

с gcc и VS тоже работает

А, я не полез разбираться - думал что это extensions компилятора, а это template library (таки залез и разобрался)

У меня совсем другая задача: есть готовый код (GPLed) из которого я палкой и веревкой леплю библиотеку (LibRaw, собственно). По дороге этот код из C превращается в C++.

И есть 3rd-party патчи (OpenMP), которые там кой-чего параллелят, причем выигрыш очень большой, на самом деле (пара раз на 4-core). Вот эти патчи я и хочу присовокупить к LibRaw.

Прихреначивать туда еще и темплейты - оверкилл, тогда уж надо нормально там все переписать, благо image processing можно параллелить не на уровне отдельных for, а прямо по человечески.

понятно. на TBB лучше с 0 писать.

Прошу прощения, но бродил по интернету, наткнулся на ветку и поскольку речь идет о OpenMP - не удержался. :) На днях мы выпустили первую бета версию статического анализатора кода VivaMP. Он предназначен для диагностики ошибок в параллельных программах, построенных на основе OpenMP. А еще в подарок статья:

32 подводных камня OpenMP при программировании на Си++
http://viva64.com/art-3-1-464379766.html

С уважением, Андрей Карпов.