Здравствуйте, zombiecomatozzz, Вы писали:
Z>требуется написать программу для многопоточного вычисления числа пи по формуле pi/4=1-1/3+1/5-1/7+... Попробовал вот так: Z>получаются всегда разные значения и не слишком точные. например 3.13413 Подскажите что не так делаю?
Завершения потоков надо ждать, иначе ты выводишь число пока потоки его ещё считают.
Числа с плаваещей точкой надо суммировать надо начиная с меньших по абсолютному значению чисел, иначе будет большая погрешность.
Каждый поток должен накапливать свою частную сумму, по завершению потоков их надо сложить, иначе синхронизация убьёт любое ускорение от многопоточности.
Слагаемые надо распределять между потоками либо статически алгоритмически (например, первый поток суммирует от 0 до 999, второ от 1000 до 999 и т.д.), либо динамически, но большими пачками. Иначе синхронизация иначе синхронизация убьёт любое ускорение от многопоточности.
Здравствуйте, zombiecomatozzz, Вы писали:
Z>требуется написать программу для многопоточного вычисления числа пи по формуле pi/4=1-1/3+1/5-1/7+... Попробовал вот так:
программа, конечно, многопоточная, но, думаю, что требуется подойти к решению с другой стороны
у вас вся многопоточность убита мьютексом, то есть параллельного выполнения нет и по перформансу то же самое, что запустить в одном потоке
попробуйте так:
задали N — кол-во слагаемых из ряда
задали k — кол-во потоков
далее каждому потоку даем свою подзадачу : например, потоку номер z подсчитать сумму элементов ряда с индексами z, z + k, z + 2*k, z + 3*k, ..., которые меньше N
после того, как все потоки отработали, надо собрать воедино k чисел (одно число из потока) и сложить их в main, это и будет результат выполнения всех потоков
Z>int main() Z>{ Z> hMutex = CreateMutex( NULL, FALSE, NULL ); Z> for(int i=0; i<NUM_THREAD; i++) Z> CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadProc,0,0,0); //here we need to wait for all threads, use returned handle from CreateThread Z> cout<<pi; Z> cin.get(); Z>}
Z>[/ccode]
Z>получаются всегда разные значения и не слишком точные. например 3.13413 Подскажите что не так делаю?
в коде написал комментарий : вы выводите результат, хотя вычисления еще не закончились во всех потоках
успехов
Здравствуйте, zombiecomatozzz, Вы писали:
Z>требуется написать программу для многопоточного вычисления числа пи по формуле pi/4=1-1/3+1/5-1/7+... Попробовал вот так:
и в чём же ваше проявление многопоточности? если всё вычесление выполняется под одним мутексом, а вообще за такой код 2ку при обучении нужно ставить, или с работы увольнять по проф. непригодности.
Здравствуйте, remark, Вы писали:
R>Числа с плаваещей точкой надо суммировать надо начиная с меньших по абсолютному значению чисел, иначе будет большая погрешность.
Не всегда практично складывать начиная именно с меньших, как компромисс между скоростью и точностью можно применять http://en.wikipedia.org/wiki/Kahan_summation_algorithm — советую хотя бы одним глазком взглянуть для общего развития.
Здравствуйте, Sni4ok, Вы писали:
S>и в чём же ваше проявление многопоточности? если всё вычесление выполняется под одним мутексом, а вообще за такой код 2ку при обучении нужно ставить, или с работы увольнять по проф. непригодности.
R>Каждый поток должен накапливать свою частную сумму, по завершению потоков их надо сложить, иначе синхронизация убьёт любое ускорение от многопоточности.
То есть для каждого потока надо свою функцию писать?
Здравствуйте, dilmah, Вы писали:
L>>Не всегда практично складывать начиная именно с меньших D>в данном конкретном случае это не составляет никакого труда.
Да, согласен, я это тоже увидел, я в общем имел ввиду.
Здравствуйте, zombiecomatozzz, Вы писали:
Z>Здравствуйте, remark, Вы писали:
R>>Каждый поток должен накапливать свою частную сумму, по завершению потоков их надо сложить, иначе синхронизация убьёт любое ускорение от многопоточности. Z>То есть для каждого потока надо свою функцию писать?
Кури параметры у ThreadProc