Параллельная производительность OpenMP C ++ лучше двухъядерного ноутбука, чем восемь ядер кластера - PullRequest
2 голосов
/ 29 мая 2011

Прежде всего, OpenMP, очевидно, работает только на одной из материнских плат в кластере, в этом случае каждая материнская плата оснащена двумя четырехъядерными процессорами Xeon E5405 с тактовой частотой 2 ГГц и работает под управлением Scientific Linux 5.3 (выпущена в 2009 году на основе Red Hat). Мой ноутбук, с другой стороны, имеет core2duo T7300 с частотой 2 ГГц под управлением Windows 7. Никакой гиперпоточности ни на одной машине.

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

Есть два класса, "куб" и "пробел". Пространство содержит трехмерный массив (20x20x20) кубов, а код, который я пытаюсь распараллелить, представляет собой трехсторонний вложенный цикл, который вызывает функцию-член куба для каждого из кубов. Эта функция-член имеет три аргумента (удваивается) и выполняет некоторые вычисления на основе частных переменных каждого куба.

inline void space::cubes_refresh(const double vsx, const double vsy, const double vsz) {
int loopx, loopy, loopz;
#pragma omp parallel private(loopx, loopy, loopz)
{
    #pragma omp for schedule(guided,1) nowait 
    for(loopx=0 ; loopx<cubes_w ; loopx++) {
        for(loopy=0 ; loopy<cubes_h ; loopy++) {
            for(loopz=0 ; loopz<cubes_d ; loopz++) {
                // Refreshing the values in source
                if ( (loopx==source_x)&&(loopy==source_y)&&(loopz==source_z) )
                    cube_array[loopx][loopy][loopz].refresh(0.0,0.0,vsz);
                // refresh everything else
                else
                    cube_array[loopx][loopy][loopz].refresh(0.0,0.0,0.0);
            }
        }
    }   // End of loop
}

Я не знаю, где может быть проблема, как я уже говорил, в моем ноутбуке я вижу ожидаемое улучшение производительности, но точно такой же код на сервере значительно хуже. Вот флаги, которые я использую на своем ноутбуке (пробовал использовать те же флаги, но ничего):

g++ -std=c++98 -fopenmp -O3 -Wl,--enable-auto-import -pedantic main.cpp -o parallel_openmp  

А на сервере:

g++ -std=c++98 -fopenmp -O3 -W -pedantic main.cpp -o parallel_openmp

Я использую gcc версии 4.5.0, а сервер работает под управлением 4.1.2. Я не знаю версию OpenMP на сервере, так как не знаю, как это проверить, я думаю, что это версия до 3.0, так как коллапс в петлях не работает. Может ли это быть проблемой?

Ответы [ 2 ]

0 голосов
/ 30 мая 2011

Единственное, что я могу подумать, может быть причиной проблемы является то, что по какой-то причине на сервере все потоки, обращающиеся к массиву элементов куба, вызывают много ошибок кэширования, но не произойдет ли это и в программе, работающей на моем ноутбуке

0 голосов
/ 29 мая 2011

gcc не поддерживал OpenMP до 4.2 , OpenMP 3.0 поддерживался начиная с gcc 4.4 . Возможно, ваш поставщик операционной системы перенес изменения в 4.1.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...