2012-06-12 2 views
4

Я пишу программу, которая читает огромный файл (3x280 ГБ) и выполняет процедуру подбора данных в файле. Довольно удобно параллелизировать такую ​​программу, где это легко сделать с помощью OpenMP.Открывает ли OpenMP частные объекты?

Я не понимаю, как частные переменные принимаются в OpenMP. Как мы все знаем, obcejts fstream не копируются и интуитивно, что помешало мне использовать его как частный объект. Поэтому читатель файла был разделен.

У меня возникла некоторая проблема позже, и я подумал о том, чтобы попытаться сделать так, чтобы частные пользователи ... и угадайте, что? это сработало!!! Как это возможно? если объект не копируется, как OpenMP может использовать разные копии одного и того же объекта для каждого ядра?

Это как моя программа выглядит следующим образом:

fstream dataReaderX(Dirs[0].c_str(), ios::in | ios::binary); 
fstream dataReaderY(Dirs[1].c_str(), ios::in | ios::binary); 
fstream dataReaderZ(Dirs[2].c_str(), ios::in | ios::binary); 
#pragma omp parallel num_threads(cpus_num) shared(...) private(...,dataReaderX,dataReaderY,dataReaderZ) 
{ 
... 
} 

Спасибо.

ответ

5

firstprivate переменные копируются, а не private - для последнего конструктор по умолчанию называется:

Раздел 2.9.3.3 - private пункт:

Новый элемент списка инициализации или имеет неопределенное начальное значение, как если бы оно было объявлено локально без инициализатора. Порядок, в котором вызываются конструкторы по умолчанию для разных частных переменных типа класса, не указан. Порядок, в котором вызываются любые деструкторы C/C++ для разных частных переменных типа класса, не указан.

Вот простой демонстрационный код:

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

int main (void) 
{ 
    std::fstream reader("test.txt", std::ios::in); 
    printf("Main thread: reader.is_open() = %d\n", reader.is_open()); 
    #pragma omp parallel private(reader) 
    { 
     printf("Thread %d: reader.is_open() = %d\n", 
      omp_get_thread_num(), reader.is_open()); 
    } 
    return 0; 
} 

А вот выход, как и ожидалось:

Main thread: reader.is_open() = 1 
Thread 1: reader.is_open() = 0 
Thread 0: reader.is_open() = 0 
Thread 3: reader.is_open() = 0 
Thread 2: reader.is_open() = 0 

Одна забавная вещь в том, что Intel C++ Compiler ошибется с внутренней ошибкой (а неудачная утверждение) - протестировано с версиями 11.1, 12.0 и 12.1. С другой стороны, компилятор GNU C++ придерживается стандарта (выход выше от g++). Оба компилятора жалуются, когда вместо этого используется firstprivate, хотя компилятор Intel C++ снова ошибается с внутренней ошибкой.

Это может показаться глупым, но вы проверили, что вы включили поддержку OpenMP в конкретном компиляторе, который вы используете?

Смежные вопросы