Вычислительная резьба для вычисления квадратного корня - PullRequest
0 голосов
/ 26 сентября 2019

Напишите две независимые программы: thr_atomic.c и thr_reduce.c .каждый из которых использует m вычислительных потоков для одновременного вычисления суммы квадратных корней от 1 до n, где m и n - степени 2 и указаны в командной строке.

Для программы атомарный.c .он получает значения m и n из аргументов командной строки и преобразует их в два целых числа соответственно.

Затем он создает m потоков, используя pthread_create(), и каждый поток вычисляет сумму n / m квадратных корней.

А именно, первый поток (то есть поток 0) вычисляет сумму квадратных корней от 1 до n / m, второй поток (то есть поток 1) вычисляет сумму квадратных корней из n / m + 1до 2n / m и т. д.

Когда поток завершает свои вычисления, он должен вывести свою частичную сумму и атомарно добавить ее в общую глобальную переменную.Обратите внимание, что ваша программа должна использовать pthread_barrier_wait(), чтобы сообщить основному потоку, что все m вычислительных потоков сделали атомарные добавления, и, следовательно, она может напечатать результат.

Ниже приведен пример запуска вашего потокаПрограмма:

bach> /thr_atomic 2 65536

thr 0: 3954518.036356

thr 1: 7230420.422587

sum of square roots: 11184938.458943

Программа thr_reduce.c аналогична thr.atomic.c за исключением того, что вам нужно использовать подход параллельного сокращения для объединения частичногосуммы.То есть ваша программа использует общий глобальный массив, и каждый вычислительный поток сохраняет свою частичную сумму в элементе массива, индексируемом по его идентификатору потока.

Затем половина этих потоков вызывает pthread.join(), чтобы дождаться своего соответствующего партнера.завершение потоков, и затем каждый из этих потоков может добавить два числа в массив вместе.Эта процедура сокращения будет выполнена log (m) раз, а время кэширования количества активных потоков будет уменьшено вдвое.Например, предположим, что существует 8 вычислительных потоков.На первом этапе сокращения, чтобы добавить два элемента в массив, поток 4 должен ожидать выполнения потока O, поток 5 должен ожидать выполнения потока I, потоки 6 должны ожидать выполнения потока 2, а поток 7 должен ожидатьдля темы 3 сделано.На втором этапе восстановления поток 6 ожидает завершения потока 4, а поток 7 ожидает завершения потока 5.На третьем этапе поток 7 ожидает завершения потока 6 и затем печатает окончательный результат.Подсказка: чтобы найти идентификатор потока партнера во время i-го шага сокращения, поток может использовать свой идентификатор XOR с 2 ^ (ri), где r = log (m).Обратите внимание, что основной поток просто вызывает pthread.exit() после создания m потоков.Не нужно ждать этих тем.Вызов pthread.exit() в главном потоке позволит другим потокам продолжить выполнение.

...