члены данных в цикле OpenMP - PullRequest
5 голосов
/ 05 мая 2011

У меня есть следующий класс:

Class L{
    public:
    bool foo(vector<bool> & data);
    private:
    C** cArray;
}

и хотел бы распараллелить цикл for в функции foo, которая вызывается somtime после создания объекта L и инициализации всех элементов в cArray.

bool L::foo(vector<int> & data){
int row, col;
#pragma omp parallel shared(SIZE, cArray, data) private(row, col)
    for (row=0, row<SIZE; ++row)
    {
        for (col=0; col<SIZE; ++col)
        {
            cArray[row][col].computeScore(data);
        }
    }
}    

Но это дает ошибку: ошибка C3028: «L :: cArray»: в предложении совместного использования данных может использоваться только переменный или статический член данных.

Можно ли что-то сделать с этим, если я не хочу делать cArray статическим?

1 Ответ

6 голосов
/ 05 мая 2011

Этот вопрос поднимался несколько раз раньше. Проблема в том, что члены класса не могут быть созданы во время компиляции. Если они используются совместно, проблем не возникает, поскольку переменные по умолчанию совместно используются в OpenMP (если только вы не измените значение по умолчанию на private - чего вы не можете сделать в C - или ничего). Однако, если они определены как частные, то компилятор должен знать, как делать частные копии, и эта информация не всегда доступна во время компиляции.

К сожалению, если вы хотите охватить все свои данные (используя явные условия определения объема данных), что вам следует сделать, то у вас есть проблема. Оперативные предложения могут обрабатывать только переменные, а не члены класса. Отключение их от любого условия определения объема данных работает до тех пор, пока значение по умолчанию остается общим. Если вы хотите, чтобы они были частными, то вам не повезло, и вы должны определить членов данных класса как переменные. К сожалению, поскольку OpenMP не является частью базового языка, я не вижу, чтобы это изменилось в ближайшее время.

...