Для начала нужно разделять код хоста и код ядра. Ядро в общем случае пишется ТОЛЬКО на C, а точнее на его диалекте для openCL. Для Nvidia можно писать на своеобразном ассемблере. Код хоста просто дергает функции opencl и может быть на чем угодно, привязка для python есть. Смысла в подобном не вижу, ибо opencl - сишный код.
По второму вопросу: есть CUDA. Есть FPGA с кастомным дизайном.
В любом случае разработка для параллельных вычислений должна начинаться с параллельного алгоритма. Некоторые задачи не параллелятся.