Por que vocês entregam um build e não o código-fonte?
O método de otimização é o nosso know-how, por isso entregamos uma biblioteca estática ou dinâmica com um cabeçalho C e um wrapper Rust enxuto. A integração exige uma linha no Cargo.toml. A correção é confirmada por testes de equivalência; a origem, pela assinatura e pela proveniência.
O que acontece quando eu altero meu código?
A integração Rust e o retorno ao original são combinados para a biblioteca. Alterar o núcleo exige nova versão e medição; CI precisa de pedido separado aceito. O escrow pode ser solicitado antes do pagamento por uma box qualificada conforme o rider.
Preciso enviar a minha estratégia?
Não para uma faixa preliminar: o harness gratuito gera um pacote de leituras sem código-fonte. Para o build precisamos do código que roda no laço quente, e só dele: em geral o simulador, os indicadores e o estado da carteira. Ele fica coberto pelo NDA, não é usado em trabalhos para outros clientes e é excluído no prazo. Parte dos seus dados pode ficar com você até o aceite: as entradas ocultas são enviadas criptografadas, e você entrega a chave quando o build estiver pronto.
Por que não simplesmente usar mais núcleos?
Faça as duas coisas. As execuções independentes de uma varredura se distribuem bem entre núcleos, e o nosso build deixa cada uma delas mais rápida em cada núcleo que você adicionar. Mais núcleos não ajudam uma única simulação ao longo de um histórico, em que cada passo depende do anterior, e é exatamente esse o código que aceleramos. Menos horas-núcleo para a mesma varredura também significam uma conta de nuvem menor.
E se a aceleração prometida não se concretizar?
No nível 1, você paga por um resultado já medido, então isso não pode acontecer. No nível 2, informamos um mínimo garantido; se ele não for atingido, o valor volta para o seu saldo conforme a tabela do contrato, e o saldo pago é devolvido mediante solicitação.
Como as linhas são contadas?
Compilamos o seu código com -C instrument-coverage no mesmo perfil e para a mesma plataforma do passaporte e executamos o benchmark do passaporte nas entradas abertas. Contamos as linhas de Rust executadas pelo menos uma vez segundo o llvm-cov. Não entram na contagem: linhas em branco e comentários, código que nunca foi executado, testes e a estrutura de suporte do benchmark, dependências de terceiros fora do escopo do trabalho e assembly; uma função genérica conta uma única vez. Esse número entra no passaporte antes do pagamento. Os dados não contam, apenas o seu código. Como referência: descompactar o corpus Silesia com o bzip2-rs executa 598 linhas do código dele, e codificar cinco clipes da Xiph com o rav1e executa 12.809 de 55.419 linhas.
Quais plataformas são suportadas?
As demos públicas exigem Linux x86-64 com AVX2/FMA. TA-Lib e vn.py foram medidos em AMD Zen 3 e Zen 4. Recursos de CPU, SO, ABI e hardware de aceitação são fixados por pedido; Intel, ARM e outros ambientes exigem avaliação própria.
Que tipo de código acelera pouco?
Decodificadores de formatos que já têm bibliotecas C otimizadas há muito tempo (LZ4, zstd, deflate): ainda não conseguimos superá-las. Codecs maduros com SIMD e assembly escritos à mão (x264, x265), primitivas criptográficas como SHA-256 e ChaCha20, processamento de dados aleatórios incompressíveis e chamadas muito curtas, em que todo o tempo vai para o overhead. Nesses casos, a estimativa gratuita mostra honestamente um ganho pequeno, e você não precisará pagar nada.
As minhas contagens de ciclos diferem das suas. Por quê?
Os ciclos dependem do modelo e da frequência da CPU, do turbo, da memória e dos dados de entrada. Os números do contrato são obtidos na bancada, conforme o passaporte de medição. O harness lê os mesmos contadores; por isso, com o mesmo modelo de CPU e as mesmas configurações, seus números devem ficar próximos dos nossos. O número de instruções depende muito menos da máquina: compare-o primeiro.
E quanto a ponto flutuante?
Por padrão, as saídas coincidem bit a bit, com uma exceção limitada para os payloads de NaN produzidos pela aritmética de ponto flutuante quando o Rust permite payloads diferentes. Codificações de NaN preservadas explicitamente e as demais saídas continuam exatas, salvo acordo diferente no passaporte. O passaporte também pode exigir payloads de NaN exatos. Qualquer outro desvio acordado é definido no passaporte e verificado por testes.
O build vai falhar em um servidor antigo?
Confira os requisitos de CPU de cada pacote. Binários públicos podem exigir AVX2/FMA e não funcionar em CPUs antigas. Recursos e eventual fallback da build paga são combinados no passaporte; nem todo binário tem fallback.
Isso vai reduzir a latência do meu trading ao vivo?
Só se o perfilamento mostrar que o cálculo é o gargalo. Para um caminho ao vivo medimos todo o percurso do evento de mercado até a ordem, por exemplo o seu p99 no seu servidor, e não uma única função: muitas vezes a maior parte do tempo vai para a rede e a bolsa. Nossos melhores resultados são cálculos em lote: backtests, treinamento e varreduras de parâmetros.
Trabalham com C, C++ e Python?
Sim, como encomendas individuais. Para C e C++ entregamos uma biblioteca substituta com a mesma ABI, de modo que os seus programas, e o código Python que chama a biblioteca, funcionam sem alterações (veja o caso TA-Lib). Para código Python entregamos um programa ou módulo nativo com a mesma saída (veja o caso vn.py). É trabalho de engenharia de nível 2 com preço individual; o autoatendimento do painel aceita por enquanto crates Rust.