На linux AMD 8-ядерный процессор с использованием g ++ 4 7.1.OpenMP-распараллеливание перестало работать
Это - для меня - головной убор. Этот следующий код работал отлично и по какой-то причине прекратил распараллеливать. Я добавил omp_get_num_procs(), и он печатает 8 процессоров. Я проверил компилятор, и -fopenmp присутствует как опция как для компоновки, так и для компиляции. Сообщение об ошибке компиляции/ссылки отсутствует. Я проверил, были ли определены какие-либо переменные среды (OMP_xxx) - их не было.
Существуют ли другие - внешние факторы, которые могут повлиять?
#pragma omp parallel
{
lightray ray;
rgba L;
printf("Max nr processors: %d\n", omp_get_num_procs());
#pragma omp for schedule(dynamic)
for (int xy = 0; xy < xy_range; xy++) {
int x = x_from + (xy % x_width);
int y = y_from + (xy/x_width);
ray = cam->get_ray_at(x, y);
L = trace_ray(ray, 0, cam->inter);
cam->set_pixel(x, y, L);
}
}
dtime = omp_get_wtime() - dtime;
printf("time %f\n", dtime);
}
EDIT: Я думаю, что я нашел что-то здесь ... Командная строка для г ++, порожденного Anjuta содержит следующее:
-DPACKAGE_LOCALE_DIR=\""/usr/local/share/locale"\" -DPACKAGE_SRC_DIR=\"".. -fopenmp . "\"
Определение PACKAGE_SRC_DIR, кажется, «включить» в -fopenmp флаг , который скроет его из g ++. Не нашли причину еще ...
Где находится 'xy_range'? – Richard
'rgba L' и' lightray ray' создают взаимозависимость между итерациями цикла, которые могут отбрасывать компилятор, нужно ли их определять за пределами цикла? – Mgetz
int xy_range; (значение постоянное - никакого конфликта. О переменных rgba и lightray, я пробовал как внутри, так и снаружи - никакой разницы, и это работало раньше, так же как и сейчас. Спасибо, хотя! – jcoppens