Я изучаю OpenMP. Для этого я пытаюсь сделать существующий код параллельным. Но я, кажется, получаю худшее время при использовании OpenMP, чем когда нет.Параллелизм и оптимизация с использованием OpenMP
Мой внутренний цикл:
#pragma omp parallel for
for(unsigned long j = 0; j < c_numberOfElements; ++j)
{
//int th_id = omp_get_thread_num();
//printf("thread %d, j = %d\n", th_id, (int)j);
Point3D current;
#pragma omp critical
{
current = _points[j];
}
Point3D next = getNext(current);
if (!hasConstraint(next))
{
continue;
}
#pragma omp critical
{
_points[j] = next;
}
}
_points является pointMap_t, определяется как:
typedef boost::unordered_map<unsigned long, Point3D> pointMap_t;
Без OpenMP мой бег времени 44.904s. С включенным OpenMP, на компьютере с двумя ядрами это 64.224s. Что я делаю неправильно?
Это segfaults без него. Я не думаю, что могу изменить карту из двух разных потоков одновременно. –