Я реализовал довольно широкий спектр нелинейных решателей на GPU, включая LBFGS, градиентный спуск Barzilai Borwein и нелинейный сопряженный градиент.
Для этого нелинейный сопряженный градиент Dai & Yuan был наиболее эффективным. В общем, другая версия нелинейного сопряженного градиента может быть более эффективной (например, CG-DESCENT), но также может быть сложнее в реализации.
В общем, LBFGS - очень хороший выбор, и, если вы действительно не стеснены в памяти, возможно, это лучшее место для начала.
И для сопряженного градиента, и для BFGS требуется поиск строк, и именно здесь fp32 становится проблемой. Вместо того, чтобы использовать стандартные условия Вульфа для поиска строки, я бы предложил использовать приблизительное условие Вольфа, предложенное здесь . Статья немного сложная, но важная вещь - уравнение 4.1. По сути, они явно вводят точность, с которой вы можете рассчитать свою функцию.
Соображения по поводу GPU:
У вас много мелких проблем, которые немного отличаются от моего варианта использования одной большой проблемы. Рассмотрите возможность запуска 1 задачи на блок GPU (или, скорее, деформации), если вы можете распараллелить вычисления функций и градиентов, чтобы использовать все потоки в блоке. Таким образом, это не проблема, если для разных задач требуется разное количество итераций.
Если это не вариант, я бы пошел с решателем LBFGS. Если ваша функция хорошо себя ведет, вам может потребоваться просто использовать размер шага 1 (избегая поиска строки) и просто запустить все задачи за фиксированное количество итераций.