Могу ли я распараллелить огромные целочисленные дополнения? - PullRequest
2 голосов
/ 04 февраля 2012

Мне нужно добавить два беззнаковых 256-мегабитных целых числа более двух миллиардов раз.Поскольку перенос, безусловно, очень важен в дополнение и не может быть определен без ожидания добавления битов младшего разряда, есть ли какой-либо выигрыш в производительности от функций многоядерного ЦП, например, разделение числа на несколько частей и последующая обработка переносов?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2012

Вы можете определенно разделить это на множество частей.Например, возьмите эти два числа:

  12345
+ 67890

Теперь мы разделим их после третьей цифры между сотнями и десятками столбцов.Это дает нам

  123      45
+ 678    + 90

Рассчитать результаты каждого

  123      45
+ 678    + 90
-------------
  801     135

В левом наборе чисел вам нужно знать, сколько цифр вы отрубили, в данном случае две цифры, поэтомудобавьте два нуля обратно в конец 801, что даст вам 80100. И прибавьте 135 к нему, и у вас будет 80235.

Вы можете сделать это с гораздо большими числами и таким количеством разбиений, сколько захотите.Использование этого метода предотвращает возникновение переноса.

Конечно, когда вы рекомбинируете большие числа, у вас все еще остаются большие добавления.Вы могли бы, вероятно, выяснить, сколько цифр было в руках, и просто добавить это небольшое количество к своему левому номеру.

Например, в нашем примере выше наш номер справа в конечном итоге перешел от 2 столбцов к3 столбца, с результатом 135. Таким образом, дополнительный столбец - это число, которое нужно перенести, которое может быть добавлено к вашему 801. Это позволяет вам добавить к небольшому числу, а затем просто объединить два числа, как если бы вы были строкой

45 и 90 оба заняли два столбца, в результате чего было получено 135. Мы берем любые сгенерированные дополнительные столбцы, в данном случае только 1, и добавляем их к нашему левому числу 801.

801 + 1 = 802   
802 concatenated with 35 = 80235

Если вы хотите что-то чрезвычайно эффективное, я уверен, вы могли бы посмотреть, как 32-разрядные процессоры добавляют 64-разрядные или более крупные числа.Я уверен, что они делают нечто подобное для 64-разрядных чисел, добавляя два 32-разрядных раздела и перенося их из наименее значимого 32-разрядного в наиболее значимый.

И с точки зрения распараллеливания, разбиениесложите свое число в 32-битные пары, которые нужно сложить вместе, затем определите, сколько доступных потоков процессор может обработать за один раз, разделите список пар на столько и дайте столько же каждому потоку.Когда результаты вычислены, поместите их в законченный раздел.

Хитрость переноса чисел от наименее значимого к наиболее значимому, как только вы получите все результаты обратно, будет непростой задачей, так как добавление даже одного 1Значение числа может привести к тому, что оно переместится и на другое число.

0 голосов
/ 07 марта 2012

Если вы наведите курсор мыши на теги, вы найдете информацию о количестве участников, заинтересованных в этой теме:

  • многоядерный - 118
  • многопоточность - 2.1k
  • C - 11,7k
  • C ++ - 17k
  • производительность 1.3k
  • спин-блокировка - 5
  • атомный - 18

Вы можете выбрать один предмет, а затем сузить количество вопросов, добавив другой / другие.

Ваш исходный пост был связан с более эффективным добавлением с использованием многоядерности, поэтому многоядерный будет одним тегом для выбора. Так как многопоточность является частью любой ОС или приложения, использующего многоядерный режим, выберите это. Теперь у вас есть 117 вопросов. Вы можете выбрать вопросы пользователей с большим количеством баллов, чем с меньшим. Посмотрите на теги для отдельных вопросов и избегайте вопросов с C #, Java и .Net, поскольку эти темы больше касаются эффективности производства кода, а не эффективности выполнения кода.

Другими понятиями, которые вы можете искать, являются аффинность, критическая секция, насыщенность, блокировка / барьер памяти, потокобезопасность, rdtsc.

Одна вещь, которую вы можете иметь в виду, заключается в том, что практичность написания действительно быстрого кода во многом связана с методом проб и ошибок, смачиванием ног или тем, как вы хотите это назвать. Здесь вы можете найти подсказки о том, что вы можете попробовать, о чем вы бы хотели позаботиться.

Что касается моего первоначального ответа с GMP, я рекомендую вам посетить страницу автора . Он содержит информацию о таких вещах, как постоянная пропускная способность команд для различных архитектур x86, деление на постоянное целое число с использованием умножения целых чисел и победа в конкурсе Simon Singh Code Book. Существует также информация о производительности самого GMP.

0 голосов
/ 01 марта 2012

Почему бы вам не использовать библиотеку GMP ?

...