Perché consegnate una build e non il sorgente?
Il metodo di ottimizzazione è il nostro know-how, quindi consegniamo una libreria statica o dinamica con un header C e un sottile wrapper Rust. Per collegarla basta una riga in Cargo.toml. La correttezza è confermata dai test di equivalenza, l’origine dalla firma e dalla provenienza.
Che cosa succede se modifico il mio codice?
Integrazione Rust e ritorno all’originale si concordano per la libreria. Un nucleo modificato richiede nuova versione e misurazione; CI richiede un ordine separato accettato. L’escrow si può richiedere prima del pagamento tramite una box qualificata secondo il rider.
Devo inviarvi la mia strategia?
Non per un intervallo preliminare: l’harness gratuito produce un pacchetto di letture senza codice sorgente. Per la build ci serve il codice che gira nel ciclo caldo, e solo quello: di solito il simulatore, gli indicatori e lo stato del portafoglio. È coperto dall’NDA, non viene usato nel lavoro per altri clienti e viene cancellato alla scadenza prevista. Una parte dei suoi dati può restare presso di lei fino al collaudo: gli input nascosti arrivano cifrati e la chiave viene fornita quando la build è pronta.
Perché non aggiungere semplicemente più core?
Faccia entrambe le cose. Le esecuzioni indipendenti di uno sweep si distribuiscono bene sui core, e la nostra build rende più veloce ciascuna di esse su ogni core aggiunto. Più core non aiutano una singola simulazione lungo uno storico, dove ogni passo dipende dal precedente, ed è proprio questo il codice che acceleriamo. Meno ore-core per lo stesso sweep significano anche una bolletta cloud più bassa.
E se l’accelerazione promessa non si concretizza?
Sul livello 1 si paga un risultato già misurato, quindi non può succedere. Sul livello 2 indichiamo un minimo garantito: se non viene raggiunto, l’importo torna sul suo saldo secondo la tabella del contratto, e i fondi versati sul saldo vengono rimborsati su richiesta.
Come si contano le righe?
Compiliamo il suo codice con -C instrument-coverage nello stesso profilo e per la stessa piattaforma indicati nel passaporto, ed eseguiamo il benchmark del passaporto sugli input aperti. Contiamo le righe Rust eseguite almeno una volta secondo llvm-cov. Non si contano: righe vuote e commenti, codice mai eseguito, test e codice di contorno del benchmark, dipendenze di terze parti fuori dall’ambito del lavoro e assembly; una funzione generica conta una volta sola. Questo numero entra nel passaporto prima del pagamento. I dati non contano, solo il suo codice. Come riferimento: la decompressione del corpus Silesia con bzip2-rs esegue 598 righe di codice del crate, e la codifica di cinque clip Xiph con rav1e esegue 12.809 righe su 55.419.
Quali piattaforme sono supportate?
Le demo pubbliche richiedono Linux x86-64 con AVX2/FMA. TA-Lib e vn.py sono stati misurati su AMD Zen 3 e Zen 4. Funzioni CPU, OS, ABI e hardware di accettazione si fissano per ordine; Intel, ARM e altri ambienti richiedono valutazione propria.
Quale codice si accelera poco?
I decoder di formati che hanno già librerie C ottimizzate da anni (LZ4, zstd, deflate): finora non le abbiamo superate. I codec maturi con SIMD e assembly scritti a mano (x264, x265), le primitive crittografiche come SHA-256 e ChaCha20, l’elaborazione di dati casuali incomprimibili e le chiamate molto brevi, in cui tutto il tempo se ne va in overhead. In questi casi la stima gratuita mostra onestamente un guadagno ridotto, e non c’è nulla da pagare.
I miei conteggi di cicli sono diversi dai vostri. Perché?
I cicli dipendono da modello di CPU, frequenza, turbo, memoria e dati di input. I numeri contrattuali si rilevano sul banco secondo il passaporto di misura. L’harness legge gli stessi contatori: con lo stesso modello di CPU e le stesse impostazioni i suoi numeri dovrebbero essere vicini ai nostri. Il numero di istruzioni dipende molto meno dalla macchina: lo confronti per primo.
E i numeri in virgola mobile?
Per impostazione predefinita gli output coincidono bit per bit, con un’eccezione limitata per i payload dei NaN prodotti dall’aritmetica in virgola mobile, dove Rust ammette payload diversi. Le codifiche di NaN preservate esplicitamente e gli altri output restano esatti, salvo diverso accordo nel passaporto. Il passaporto può anche richiedere payload dei NaN esatti. Qualsiasi altro scostamento concordato è definito nel passaporto e verificato dai test.
La build andrà in crash su un server datato?
Controlla i requisiti CPU di ogni pacchetto. I binari pubblici possono richiedere AVX2/FMA e non funzionare su CPU vecchie. Funzioni e possibile fallback di una build pagata si concordano nel passaporto; il fallback non è implicito in ogni binario.
Ridurrà la latenza del mio trading dal vivo?
Solo se la profilazione mostra che il calcolo è il collo di bottiglia. Per un percorso dal vivo misuriamo l’intero tragitto dall’evento di mercato all’ordine, ad esempio il suo p99 sul vostro server, non una singola funzione: spesso la maggior parte del tempo se ne va in rete e in borsa. I nostri risultati migliori riguardano i calcoli batch: backtest, addestramento e sweep di parametri.
Lavorate con C, C++ e Python?
Sì, come ordini individuali. Per C e C++ consegniamo una libreria sostitutiva con la stessa ABI, così i vostri programmi, e il codice Python che chiama la libreria, funzionano senza modifiche (vedi il caso TA-Lib). Per il codice Python consegniamo un programma o modulo nativo con la stessa uscita (vedi il caso vn.py). È lavoro di ingegneria di livello 2 con prezzo individuale; il self-service della dashboard accetta per ora crate Rust.