Комментировать

Как вариант можно попытаться

Как вариант можно попытаться минимизировать пересылку данных:
1. после завершения операции не очищать память gpu, строить карту ram_pointer->gpu_pointer(ещё что-то типа хэша можно) , соответственно когда вызывается операция аргументом которой является указатель который уже есть карте, то сделать небольшую проверку - не изменились ли данные (хэшем(выборкой нескольких значений и т.п.) ) и соответственно использовать то, что уже есть в gpu.
2. соответственно когда память gpu заканчивается - удалять старые данные
3. чтобы не возвращать результат на каждой операции, можно использовать разного рода трюки - например модифицировать атрибуты страниц памяти - при чтении/записи срабатывает исключение - на котором сидит наш обработчик - который нужные данные из gpu и вытащит. Кстати такие трюки можно использовать и для проверки данных на изменения (т.е. в первом пункте).
4. Если серебряная пуля не нужна, а необходимо прикрутить этот blas к конкретному приложению - открывается поле для ряда улучшений. Например, можно один раз чётко выяснить на каких этапах меняются данные, на каких считываются результаты(именно считываются, а не передаются в следующую blas функцию)
В общем вариантов масса.