Estou pensando em contratar alguém para implementar o processamento de GPU no Postgres para acelerar varreduras sequenciais em um banco de dados localizado em um ramdisk. Quanto você acredita que eu poderia ganhar usando essa abordagem? Eu poderia comprar qualquer tipo de placa gráfica. Eu sei que esta pergunta é muito difícil, mas eu sei muito pouco sobre GPU, então um palpite bem aproximado me ajudaria muito.
EDIT: Embora meu interesse seja especificamente para Postgres, eu poderia fazer esta pergunta de uma maneira diferente: "Qual é o aumento potencial de desempenho usando GPU para varreduras sequenciais em um banco de dados na memória". Se a resposta for que ele tem um potencial de 10 a 50 vezes o desempenho, posso começar a investigar mais especificamente se isso também pode ser realizado no Postgres.
É melhor você fazer essa pergunta na lista de discussão dos hackers, já houve algum debate sobre esse assunto no passado. Os desenvolvedores do PostgreSQL podem dizer muito mais sobre isso.
http://archives.postgresql.org/pgsql-hackers/
Para obter um bom desempenho usando uma GPU para PostgreSQL, você precisa de alguma forma de processamento paralelo no PostgreSQL. Isso é algo que o PostgreSQL não tem no momento (para CPU nem GPU), mas o Greenplum já implementou isso em seu produto PostgreSQL para CPUs. O processamento paralelo está na lista de tarefas, mas parece que ninguém está trabalhando nisso no momento. Pergunte aos hackers do PostgreSQL sobre o status atual.
Eu tropecei em algumas pesquisas para sqllite que podem ser aplicáveis. Eles relataram aumento de desempenho de 20-70X para alguns aplicativos
Escusado será dizer que sua milhagem pode variar.
Eu não acho que a varredura sequencial vai melhorar muito. Principalmente uma varredura sequencial está iterando cada registro de sua tabela e aplica uma função de avaliação retornando um valor booleano. Os registros correspondentes à condição são selecionados para processamento posterior. A avaliação da função, que pode ser algo como value>3.14 ou sin(value1) > sin(value2), deve ser codificada pelo mecanismo SQL como um kernel Cuda/OpenCL e, em seguida, executada na GPU. Se você avaliar uma função definida pelo usuário, toda a função deverá ser convertida em um kernel. Se a função acessar alguma outra estrutura de dados, é impossível reescrevê-la como um kernel. Claro, toda essa conversão acontece nos bastidores, o "usuário" só deve escrever SQL. Além disso, os dados na memória devem ser movidos para o espaço de memória da GPU, como uma estrutura de memória linear, como um vetor real (não STL). Após deduzir todas essas penalidades, dependendo do tipo de sua função, você poderá se beneficiar da velocidade superior da GPU. Portanto, você se beneficia apenas se sua função for complicada, você tiver muitos dados, mas ainda assim a função for traduzível para um kernel. Sua instância do postgres deve ser capaz de escrever o kernel em tempo real e, em seguida, chamar o compilador.
Por outro lado, se você quiser resolver um problema específico com a GPU, alguém pode codificá-la diretamente como um cliente para o PostgreSQL.