2012-12-28 5 views
1

Я использую Aparapi для обработки чисел в моей программе Java на графическом процессоре. Из того, что я понимаю, Апарапи отлично играет с плавающими массивами.Вычисление Pi с использованием массивов Float или Integer

Я хочу вычислить Pi до N-го десятичного числа, используя Aparapi. Я думаю об использовании метода Лейбница, но я не уверен, как бы я работал с представлением и хранением длинных десятичных знаков в форме float или integer.

Будет ли массив целых чисел работать с размером массива, являющимся нулевым числом десятичных знаков?

int[] digits = new int[N]; 

Если бы я использовать это с методом Лейбница, я должен был бы вычислить массив N целых чисел для точки М я найти (Liebniz говорит пи/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 ....), а затем добавьте их вместе и умножьте полученное число на 4. Но это будет означать, что мне нужно будет выделить M целых чисел для КАЖДОГО термина, который я вычислил, что бы добавить и действительно сказывается на памяти.

tl; dr: Как я могу вычислить Pi с использованием циклов операций поплавка, чтобы я мог сделать это с помощью Aparapi?

Спасибо!

+0

Это * действительно * медленный способ вычислить пи , – Blender

+0

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

+0

Вы все равно будете хранить номера, независимо от вашего алгоритма. Вот гораздо более быстрый алгоритм: http://stackoverflow.com/questions/14065929/calculating-pi-using-float-or-integer-arrays#comment19442832_14065929 – Blender

ответ

2

Вам нужно уменьшить, чтобы частично добавить элементы m в аннотированный массив @Local (используется для локальной памяти в aparapi). Допустим, что существует N общих элементов, поэтому вам нужны N/m частичные суммы, которым требуется более высокая пропускная способность (поэтому в локальной памяти).

Также вы должны использовать localBarrier(); для синхронизации ядер в вычислительных единицах или рабочих единицах в местных рабочих группах. Затем отправьте данные в основную память.

Очень короткий пример:

Вам необходимо 1 + 2 + 3 + 4 + 5 + 6 + ..... и у вас есть 3 ядер на вычислительный блок ГПА.

1 + 2 выполняется в базовом номером 1

3 + 4 производится в основной номером 2

5 + 6 выполняется в базовом номером 3

затем добавить выходы сердечников в локальная память, которая разделяется всеми соседними ядрами этого вычислительного блока.

Наконец, вы получите 3,7,11 в массиве, суммарно равном 21 в локальной памяти.

Все эти данные всех вычислительных блоков в основной памяти, таких как 21,57, ..., вы можете добавить их все просто в CPU.

Конечно будет (+/-) (1/(2 * п + 1)) вместо 1,2,3,4,5