Я разрабатываю криптографический алгоритм на графическом процессоре и в настоящее время придерживаюсь алгоритма для выполнения большого целочисленного добавления. Большие целые числа представляются обычным способом как куча 32-битных слов.
Например, мы можем использовать один поток для добавления двух 32-битных слов. Для простоты предположим, что что добавляемые числа имеют одинаковую длину и количество потоков на каждый блок == количество слов. Тогда:
__global__ void add_kernel(int *C, const int *A, const int *B) {
int x = A[threadIdx.x];
int y = B[threadIdx.x];
int z = x + y;
int carry = (z < x);
/** do carry propagation in parallel somehow ? */
............
z = z + newcarry; // update the resulting words after carry propagation
C[threadIdx.x] = z;
}
Я уверен, что есть способ сделать перенос распространения через некоторую сложную процедуру сокращения, но не мог понять это.
Я просмотрел расширения CUDA thrust extensions, но большой целочисленный пакет, похоже, еще не реализован. Возможно, кто-то может дать мне подсказку, как это сделать на CUDA?