По моему опыту - разница между python и c++ будет пренебрежительно малой в данном случае, ведь сами расчёты на устройстве, а хост только за I/O и общую логику отвечает. Не работал с CUDA, но для OpenCL все упирается в копировании данных с/на GPU и запись в файлы. Нужно профилировать. Также слышал, что можно замапить область памяти с RAM или даже ROM напрямую в адресное пространство GPU. Что поможет избежать лишнего копирования(но я лично не пробовал).
По поводу использования нескольких GPU. Использовал. Даёт ускорение примерно в 0.9n - 0.95n, где n-количество вычислителей. На хосте получаются данные о примерной производительности каждого устройства, вся задача пропорционально делится на части и запускается. Потом на хосте собираются результаты.