OpenCL по модулю больших чисел - PullRequest
1 голос
/ 05 июля 2011

Я пытаюсь вычислить a mod b в OpenCL, где a - это массив ulong элементов и в два раза длиннее b.

__kernel void mod(__global ulong *a, __global ulong *b, __global ulong length) {
    // length = len(a) = 2 * len(b)
    ...
}

Что я хочуэто что-то вроде a %= b, но с массивами.Массивы, конечно, представляют собой числа, причем их последний элемент представляет наименее значимые биты.

Возможно ли сделать это на месте (т.е. без выделения дополнительной памяти)?Каков хороший алгоритм для вычисления медулуса для больших чисел?

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

Приветствуются указатели на любые полезные материалы по этому вопросу.

РЕДАКТИРОВАТЬ: , если это поможет, length можно узнать по адресувремя компиляции.

РЕДАКТИРОВАТЬ: Извините, я не понял здесь.Я не работаю с массивом целых чисел, я работаю с двумя большими целыми числами, например, a - это 8 МБ ( a 67108864-bit number ) и b4Mb ( a 33554432-bit number ).Я работаю с ними в базе 2 ^ 64, отсюда и массивы ulong целых чисел.По сути, это всего лишь цифры номера.

1 Ответ

0 голосов
/ 08 июля 2011

Вы просто делаете:

__kernel void mod(__global ulong *a, __global ulong *b, __global ulong length) {
   ulong id = get_global_id(0) ;
   a[id] = a[id] % b[id];
}

Я не совсем понимаю вашу проблему, размер массива отличается? Или, может быть, вы хотите более специальный расчет?

...