LINUX.ORG.RU

Пытаюсь освоить openmp

 ,


0

2

Задача: сложить два массива в третий (все массивы одинаковой длины для простоты).
Как пытаюсь решить: http://pastebin.com/GSMzMZhT
По какой-то причине не работает на входах размером от 32к (суммы в случае последовательного кода и параллельного получаются разными). ЧЯДНТ?

Да убери ты «#pragma omp parallel shared(a, b, c) private(i, N)», можешь просто оставить перед циклом директиву «#pragma omp parallel for»

N к тому же маловероятно, что private должно быть.

grem ★★★★★ ()

int *c = new int[N];

М-да, а потом кричат, что C++ такой плохой, и в нем сегфолтится всё...

на входах размером от 32к

Потому, что когда слишком много параллельных потоков, то оно может даже замедлять. Сделай 10 тредов. Меня уже в это ткнули носом вот здесь: Мне всегда казалось, что несколько потоков должны грузить все ядра процессора... . Кстати, рекомендую не пожалеть времени и прочитать тред, особенно последнюю страницу, особенно товарища AndreyKl .

Kroz ★★★★★ ()

А у меня даже не компилится :(

ага, нужно было g++ -std=c++11 -fopenmp test.cpp
то есть -std=c++11 добавить

Только твой вариант падает, а если убрать то, что я говорил, то нет.

grem ★★★★★ ()
Последнее исправление: grem (всего исправлений: 2)
Ответ на: комментарий от DaniilA

А что не так в этой строке?

Видимо смущает сырой указатель вместо вектора интов.

andreyu ★★★★★ ()
Ответ на: комментарий от grem

Я поубирал лишнее. Проблема в том, что как-то время не сильно отличается в последовательном и параллельном случае.

DaniilA ()
Ответ на: комментарий от DaniilA

Ну а чего поделать, слишком быстрые операции. Вот на двумерных массивах для перемножения матриц будет медленнее, так как там 3 вложенных цикла.

Можешь ещё обращение матрицы написать каким-нибудь из способов. Но они параллелятся не очень хорошо.

grem ★★★★★ ()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от DaniilA

int *c = new int[N];

М-да, а потом кричат, что C++ такой плохой, и в нем сегфолтится всё...

А что не так в этой строке?

Явное выделение памяти.

В С++ сделано всё, чтобы ты как можно реже пользовался new, так как управление ресурсами (в частности памятью) требует внимательности. Ладно у тебя примитивная программа, и, если где-то в arr_sum_par зарайзится exception, у тебя программа просто вылетит и это ok. А если что-то более серьезное, где ты захочешь перехватывать exception и как-то его handle'ить? А ты еще и без RAII пишешь (это должно быть на рефлексах).

В твоем случае нужно использовать std::vector.

И вообще, постарайся забыть про new. Да, есть случаи, когда без него не обойтись. Но такие случаи ооочень редки.

Kroz ★★★★★ ()

Лучше освой GCD — куда полезнее. Помимо GCD параллельные вычисления на C — это боль

anonymous ()
Ответ на: комментарий от anonymous

Openmp не мой личный выбор, а необходимость для универа.

DaniilA ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.