Прежде всего, 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, так как коллапс в петлях не работает. Может ли это быть проблемой?