Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Программирование под Unix/Linux > многопоточное вычисление |
Автор: denisminb 13.5.2013, 18:55 | ||||||
Добрый день,подскажите пожалуйста в вопросе многопоточности, читаю книги, смотрю разные реализации, в общем начал практиковаться,не совсем получается мне кажется. Для примера,может конечно не совсем удачно, взял вычисление числа PI c определенной точностью. без использования потоков, было нечто такое: описан прототип фукнции сама функция в мейне вызов функции, вывод результата итд использую
для того чтобы работало с потоками добавил в функцию void*
примерно так так вот, прога компилится, вроде как поток создается,но результат вычисления функции не отображается,не могу понять,что ещё нужно сделать хочу получить в итоге, распараллеливание вычислений, с использованием нескольких потоков итд |
Автор: Фантом 13.5.2013, 19:08 |
Пока что в этом коде результат вычисления функции отображать просто нечему (то, что закомментировано, не в счет). |
Автор: denisminb 13.5.2013, 19:14 | ||||
сама функция |
Автор: Фантом 13.5.2013, 20:22 |
Она у Вас просто зацикливается, причем потоки тут совершенно не при чем. P.S. Кстати, Вы действительно хотите делать ввод параметров в каждом потоке? |
Автор: denisminb 13.5.2013, 20:54 | ||
while (Ryad > Esp) - ну да, здесь зацикливание, скорей всего нет, правильней будет один раз ввести данные,правильно же? |
Автор: denisminb 13.5.2013, 22:07 | ||||
самое интересное,то что функция возвращала правильное значение Pi, без использования потоков |
Автор: denisminb 14.5.2013, 21:41 | ||||||
можно ещё вопрос? как думаете лучше вообще переписать алгоритм без использования While? или например от того чтобы не зацикливало,добавил
|
Автор: Фантом 14.5.2013, 23:53 | ||
Хм... в каком смысле "лучше"? |
Автор: rsm 15.5.2013, 02:57 | ||||
Для сугубо численных вычислений лучше использовать http://habrahabr.ru/post/147796/.
Цикл нужен так или иначе, просто каждому потоку нужно выделить определённый интервал вычислений количества знаков после запятой, как-то так: [0, 10000) - первый поток; [10000, 20000) - второй; [20000, 30000) - третий; [20000, 40000) - четвёртый; и т.д. в том же духе. Оптимальное количество потоков обычно принимают равным количеству ядер процессора * 2 + 1. |
Автор: denisminb 15.5.2013, 18:22 | ||||
я просто имел ввиду,как лучше сделать? |
Автор: denisminb 15.5.2013, 18:40 | ||||||
в принципе в теории я понимаю что для того чтобы программа была многопоточная,вычисляла параллельно,нужно распараллелить алгоритм,разбить на блоки. только не пойму как в моём варианте сделать? На данном этапе, в цикле вычисляю очередной член ряда и затем суммирую,выхожу из цикла по количеству итераций. Вы пишите, что нужно разбить на интервалы,этот контекст не совсем понимаю. я думал если разбить по количеству итераций, но как собрать результаты потоков?тогда нужно для каждого интервала писать свою функцию вызова для pthread_create? P.S. Нужно сделать без OpenMP, точнее даже нужно два варианта без него и с ним. Но пока его не нужно. |
Автор: rsm 15.5.2013, 20:01 |
Приведённую выше http://habrahabr.ru/post/147796/ всё-таки стоит почитать ![]() |
Автор: denisminb 15.5.2013, 20:26 | ||||
спасибо за статью,ознакомлюсь, сделал так, с блокировками
Добавлено через 6 минут и 21 секунду ага,только не совсем понимаю,как запустить в qnx версию с openMP, как хидер подключить? |
Автор: Фантом 16.5.2013, 00:02 |
Задача слишком "ненастоящая", чтобы можно было просто так выбирать что-то лучшее. Например, с математической точки зрения лучше воспользоваться оценкой остатка для ряда и, зная необходимую точность, заранее вычислить необходимое число членов (и тогда цикл while, понятно, не нужен). |
Автор: denisminb 17.5.2013, 17:13 | ||
спасибо, можете прокоментировать код "на сколько он плох или нет" пост - 15.5.2013, 20:26 |
Автор: Фантом 17.5.2013, 17:51 | ||
Это Вам действительно нужно? Ну что ж... код плох. Во-первых, по причине странной смеси "французского с нижегородским" - от старого C до чуть более современного C++. Во-вторых, по причине использования Pthreads для задачи в той предметной области, где обычно используются другие инструменты (уже упомянутый выше OpenMP). |
Автор: denisminb 18.5.2013, 10:30 | ||||
в стандартном qnx я не могу использовать openMP,поэтому использую pthread |