Я начинаю изучать CUDA, и я думаю, что вычисление длинных цифр pi было бы хорошим, вводным проектом.
Я уже реализовал простой метод Монте-Карло, который легко распараллеливается. У меня просто каждый поток случайным образом генерирует точки на единичном квадрате, вычисляет количество лежащих внутри единичного круга и подсчитывает результаты с помощью операции сокращения.
Но это, конечно, не самый быстрый алгоритм для вычисления константы. Раньше, когда я делал это упражнение на одном поточном процессоре, я использовал Машиноподобные формулы, чтобы выполнить вычисления для более быстрой сходимости. Для желающих это предполагает выражение pi как суммы арктангенсов и использование рядов Тейлора для оценки выражения.
Пример такой формулы:
К сожалению, я обнаружил, что распараллеливать этот метод с тысячами потоков GPU непросто. Проблема в том, что большинство операций просто делают математику с высокой точностью, а не выполняют операции с плавающей запятой на длинных векторах данных.
Итак, мне интересно, , что является самым эффективным способом вычисления произвольно длинных цифр pi на GPU?