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