Não consigo responder a segunda metade da sua pergunta em relação a outras implementações existentes, mas posso fornecer algumas dicas sobre os desafios. Para referência, eu pessoalmente usei o ViennaCL em uma nVidia GTX 560 Ti com 2 GB de memória para meus benchmarks.
Sobre o código de série em um i5 de gama média, vi acelerações para multiplicações densas de matriz de aproximadamente 40x. Para operações como uma multiplicação vetorial escalar, vi velocidades de 1000x. O gorila de 800 libras na sala, no entanto, é a largura de banda da memória. Para a maioria das GPUs comerciais, você usará algo como PCIe, que limita a cerca de 6 GB / s de taxa de transferência. No meu caso, enquanto o cálculo era 40x mais rápido, as três cópias matriciais (duas para a GPU e uma para trás) demoravam tanto tempo quanto a computação na CPU.
O problema, então, com qualquer biblioteca geral de álgebra linear da GPU, é que eles não podem realmente reutilizar objetos na GPU, porque não sabem o que você fará com eles. Portanto, toda chamada para um kernel de computação provavelmente precisará copiar para a GPU e, em seguida, copiar o resultado novamente. Isso consumirá grande parte dos ganhos.
Se você puder reutilizar objetos como matrizes, poderá escrever algoritmos de nível superior para evitar o máximo de gerenciamento de memória possível, mas seria difícil pressionar uma biblioteca para fazer isso com eficiência.
Espero que isso ajude, e tenho certeza de que há outras pessoas aqui com muito mais experiência nisso, mas essas são as experiências e impressões que recebi durante minha curta incursão na computação em GPU.