Я провел еще несколько тестов и создал небольшую тестовую программу, чтобы проверить, может ли проблема быть связана с работой памяти. Мне не удалось воспроизвести проблему пустой параллельной-единственной области, вызывающей замедление программы в моей небольшой тестовой программе, но я смог воспроизвести замедление, распараллелив некоторые вызовы malloc.
При запуске тестовой программы в Windows 7 64-bit с 2 ядрами ЦП заметное замедление не было вызвано использованием флага -fopenmp с компилятором gcc (g ++) и запуском скомпилированной программы по сравнению с запуском программы без OpenMP служба поддержки.
Выполнение того же в 64-битной версии Kubuntu 11.04 на том же компьютере, тем не менее, увеличило производительность в 4 раза по сравнению с версией без OpenMP. Эта проблема возникает только в Unix-системах, а не в Windows.
Источник моей тестовой программы ниже. Я также загрузил zipped-source для win и unix-версии, а также источник ассемблера для win и unix-версии как с OpenMP-поддержкой, так и без нее. Этот zip можно скачать здесь http://www.2shared.com/file/0thqReHk/omp_speed_test_2011_05_11.html
#include <stdio.h>
#include <windows.h>
#include <list>
#include <sys/time.h>
//#include <cstdlib>
using namespace std;
int main(int argc, char* argv[])
{
// #pragma omp parallel
// #pragma omp single
// {}
int start = GetTickCount();
/*
struct timeval begin, end;
int usecs;
gettimeofday(&begin, NULL);
*/
list<void *> pointers;
#pragma omp parallel for default(shared)
for(int i=0; i< 10000; i++)
//pointers.push_back(calloc(20000, sizeof(void *)));
pointers.push_back(malloc(20000));
for(list<void *>::iterator i = pointers.begin(); i!= pointers.end(); i++)
free(*i);
/*
gettimeofday(&end, NULL);
if (end.tv_usec < begin.tv_usec) {
end.tv_usec += 1000000;
begin.tv_sec += 1;
}
usecs = (end.tv_sec - begin.tv_sec) * 1000000;
usecs += (end.tv_usec - begin.tv_usec);
*/
printf("It took %d milliseconds to finish the memory operations", GetTickCount() - start);
//printf("It took %d milliseconds to finish the memory operations", usecs/1000);
return 0;
}
Что остается без ответа сейчас, что я могу сделать, чтобы избежать таких проблем на Unix-платформе.