Apabila GPU Berbaloi: Roofline Sapuan Parameter, di Mana Tajuk Utama 167x Sebenarnya 27x Algoritma Darab 6.2x Perkakasan
Sebahagian daripada siri "Backtest Tanpa Ilusi".
Tangga kelajuan berakhir dengan nada yang sengaja tidak memuaskan. Kami telah membawa sapuan parameter 80-kombo daripada 69.9 saat pandas turun kepada 0.23 saat numba selari pada CPU laptop — terukur 298x — dan kemudian berhujah bahawa GPU bukan anak tangga yang hilang. Ruangan komen tidak menerimanya dengan senyap, dan ia betul untuk tidak berbuat demikian. "Bukan anak tangga yang hilang" adalah dakwaan tentang satu beban kerja, pada satu saiz. Ia bukan hukum alam. Jadi artikel ini melakukan perkara yang jujur dan meletakkan GPU di atas bangku ujian.
Hasilnya bukan satu keputusan muktamad, ia adalah satu keluk. Kelebihan GPU berbanding CPU bukan satu nombor tunggal yang boleh anda cetak pada slaid; ia adalah fungsi berapa banyak kerja yang anda serahkan kepadanya setiap panggilan. Pada prapengiraan penunjuk pelbagai jangka masa kami, kelajuan GPU berbanding enjin CPU berjalan daripada 54.5x apabila kami memintanya satu kombinasi parameter pada satu masa hingga 359.6x apabila kami meminta 61 sekaligus. Kernel yang sama, data yang sama, perkakasan yang sama — satu-satunya perkara yang berubah adalah kelompok. Penanda aras yang melaporkan salah satu daripada nombor itu dan menyembunyikan yang lain bukan sedang mengukur GPU, ia sedang memilih tajuk utama.
Malah 359.6x pun bukan seperti yang kelihatan. Kupas ia dan tajuk utama pelbagai jangka masa yang besar iaitu 167x terurai kepada 27x algoritma — penulisan semula yang turut menjadikan CPU 27x lebih pantas — darab 6.2x perkakasan sebenar. Bukan GPU yang melakukan 27x itu. Matematik yang melakukannya. Artikel ini adalah tentang membezakan kedua-duanya, kerana mencampuradukkannya adalah cara kad grafik $2,000 dijual untuk menyelesaikan masalah yang boleh diselesaikan secara percuma oleh satu git commit.
Provenans: semua nombor di bawah diukur pada Apple M2 Max, fp32 pada GPU Metal melalui MLX berbanding numba fp64 pada dua belas bebenang CPU, daripada skrip penanda aras engine_multitf_gpu.py dan bench_param_sweep.py kami, setiap satu di-get oleh semakan kesetaraan yang mengesahkan laluan GPU dan CPU menghasilkan dagangan yang sama. Tiada kertas kajian rakan awam untuk yang ini — skrip itulah rekodnya.
Soalannya adalah roofline, bukan penanda aras

Sebab "berapa pantas GPU" tiada jawapan tunggal adalah model roofline (Williams, Waterman & Patterson, 2009). Prestasi boleh capai sesebuah pemproses dihadkan oleh dua siling serentak: satu yang rata ditetapkan oleh pengiraan puncak (FLOP/s), dan satu yang mencerun ditetapkan oleh lebar jalur memori darab keamatan aritmetik — bilangan operasi berguna yang anda lakukan bagi setiap byte yang anda pindahkan. Kerja yang murah-per-byte tinggal di bawah siling mencerun dan terikat lebar jalur; kerja yang kaya-per-byte mencapai siling rata dan cenderung-pengiraan. Siling rata GPU menjulang tinggi mengatasi siling CPU, tetapi siling mencerunnya dan, yang lebih penting, kos tetap per panggilannya tidak mengecil dengan sama anggunnya.
Bagi sapuan parameter, istilah ketiga menguasai sebelah kiri carta: overhead pelancaran dan pemindahan. Setiap panggilan GPU membayar harga yang lebih kurang tetap — hantar kernel, pindahkan input merentasi sempadan memori (bersatu, pada Apple Silicon, tetapi tidak percuma), pindahkan keputusan kembali. Modelkan masa dinding bagi kelompok kombinasi sebagai
dengan adalah overhead tetap itu, adalah kos marginal GPU per kombo, dan adalah kos CPU. Kelajuannya kemudian
Satu pecahan ini menerangkan keseluruhan artikel. Pada kecil, dalam penyebut menghancurkan nisbah itu — anda membayar untuk mengejutkan GPU dan hampir tidak menggunakannya. Apabila membesar, anda mengamortisasi merentasi lebih banyak kombo dan kelajuan memanjat menuju asimptotnya , nisbah perkakasan sebenar. Titik separuh jalan terletak pada : "titik rabung" dalam ruang kelompok yang memberitahu anda berapa lebar sapuan anda perlu sebelum GPU mencapai walaupun separuh daripada kemampuannya. Sapuan beberapa puluh kombo terletak jauh di kiri rabung itu. Sapuan beribu-ribu terletak pada bahagian rata di mana GPU akhirnya memperoleh silingnya.
Jadi soalan yang betul tidak pernah "adakah GPU lebih pantas." Ia adalah "adakah sapuan saya di sebelah kanan rabung, dan adakah kerja per-kombo saya cukup cenderung-pengiraan untuk mencapai siling rata apabila ia tiba di sana." Kedua-duanya mesti benar. Selebihnya artikel ini mengukur di mana ambang-ambang itu sebenarnya jatuh.
Keputusan jangka masa tunggal: GPU menang tipis

Mulakan dengan beban kerja yang digunakan oleh tangga kelajuan: sapuan HMA/HMA3 jangka masa tunggal, 80 kombinasi merentasi 150,000 bar. Kami menambah anak tangga keenam pada tangga itu — M5, penunjuk pada GPU Apple melalui MLX, dagangan masih diekstrak pada CPU. Dipanaskan, terbaik-daripada-tiga, get kesetaraan hijau:
| Kaedah | Masa dinding | Berbanding pandas | Kombo/s |
|---|---|---|---|
| M0 pandas + gelung | 287.08s | 1.0x | 0.3 |
| M2 numba (1 teras) | 2.02s | 142x | 39.7 |
| M4 mp + numba (12 teras) | 0.33s | 883x | 245.9 |
| M5 MLX GPU (fp32) | 0.10s | 2796x | 779.2 |
Berbanding garis dasar bersiri naif, GPU kelihatan heroik — 2,796x. Tetapi itu perbandingan yang tidak patut dibuat oleh sesiapa yang jujur: ia mengadu pelaksanaan GPU yang baik dengan pelaksanaan CPU yang paling teruk. Bariskan GPU dengan CPU yang sebenarnya akan anda gunakan — kernel yang sama pada kesemua dua belas teras, M4 — dan kemenangan itu runtuh kepada 3.2x yang sederhana (779 berbanding 246 kombo sesaat). Satu kad grafik penuh, menjalankan keseluruhan sapuan, mengalahkan kumpulan CPU dua belas teras dengan faktor tiga.
Tiga perpuluhan dua bukan tiada apa-apa. Ia juga bukan sebab sesiapa membeli GPU. Dan ia tepat seperti yang diramalkan roofline untuk sapuan sesempit ini: 80 kombo adalah di kiri rabung. Overhead pelancaran-dan-pemindahan tetap masih merupakan hirisan bermakna daripada kerja 0.10 saat, jadi kita tidak pernah mencapai asimptot . Lebih teruk lagi, sebahagian daripada kos per-kombo adalah laluan pengekstrakan dagangan O(n), yang sengaja kami tinggalkan pada CPU — istilah yang langsung tidak dapat dipercepatkan oleh GPU (lebih lanjut tentang sebabnya dalam bahagian seterusnya). Bagi gelung penyelidikan jangka masa tunggal sebesar ini, keputusan asal tangga kelajuan kekal: GPU bukan anak tangga yang hilang. Numba selari sudah pun meletakkan anda pada 0.23–0.33 saat, dan mencukur itu kepada 0.10 bukanlah apa yang membuka sekatan seorang penyelidik. Orkestrasi di sekeliling sapuan itulah yang membukanya.
Perkataan yang menarik dalam keputusan itu adalah sebesar ini. Bergerak ke kanan sepanjang paksi kelompok dan ceritanya berubah.
Di mana kos itu sebenarnya berada
Sebelum kita membesarkan kelompok, lihat apa yang sebenarnya kita bayar, kerana roofline hanya memberi ganjaran jika bahagian yang mahal itu cenderung-pengiraan. Profilkan sapuan itu dan hampir kesemuanya adalah satu perkara: konvolusi purata bergerak berpemberat. Satu HMA adalah tiga WMA; satu HMA3 adalah empat; setiap kombinasi menjalankannya semula merentasi keseluruhan siri. Pengekstrakan dagangan — melintasi dua tatasusunan penunjuk, mencari terbalikan tanda hma - hma3, mencatat pengisian — adalah satu laluan O(n) tunggal yang murah. Sapuan itu adalah beban kerja konvolusi yang memakai kostum strategi dagangan.
Pembahagian itu adalah tepat dua rejim roofline:
- Konvolusi adalah cenderung-pengiraan. Setiap harga dibaca ke dalam banyak jumlah tetingkap bertindih, jadi keamatan aritmetik — operasi per byte dipindahkan — adalah tinggi. Kerja ini menggapai siling pengiraan rata, dan siling rata GPU adalah yang menjulang. Lebih baik lagi, tetingkap-tetingkap itu bertindih merentasi kombinasi: WMA panjang 40 berguna kepada berpuluh-puluh kombo, jadi prapengiraan berkelompok berkongsinya sekali dan bukannya mengiranya semula per kombo. Pengelompokan bukan sekadar mengamortisasi overhead pelancaran; ia menaikkan keamatan aritmetik dengan mengguna semula muatan. Inilah bahagian yang layak berada di GPU.
- Pengekstrakan dagangan terikat lebar jalur dan penuh cabang. Satu laluan berurutan, cabang bergantung-data pada setiap silang, hampir tiada guna semula. Keamatan aritmetiknya hampir pada lantai, dan aliran kawalannya bermusuhan dengan peranti SIMD. Menolaknya ke GPU akan membeli sedikit dan berkos banyak; ia kekal pada CPU. Yang bermakna ia adalah ekor bersiri pembahagian hukum Amdahl — lantai tetap yang tidak akan dapat ditembusi oleh kelajuan GPU, dan sebahagian daripada sebab nombor TF-tunggal tepu pada 3.2x.
Ada pengajaran kedua yang lebih tajam bersembunyi dalam versi pelbagai jangka masa kernel ini, dan ia adalah sumber 27x yang kami terus berjanji untuk menjelaskan. Enjin multi-TF menjajarkan HMA jangka masa lebih tinggi ke atas indeks asas 1-minit tanpa look-ahead. Ditulis dengan cara yang paling jelas, itu adalah kerja O(length^1.5) per bar — mengira semula purata bergerak TF-tinggi pada setiap bar asas. Tetapi HMA terjajar itu adalah linear dalam penimbal pendek beberapa lilin TF-tinggi tertutup yang terakhir ditambah penutupan berjalan, jadi keseluruhan pengiraan per-bar runtuh menjadi satu vektor pemberat tetap: satu conv1d merentasi siri lilin tertutup diikuti oleh satu gather O(n). Ratusan juta operasi berlebihan menjadi satu konvolusi merentasi siri yang jauh lebih pendek.
Keruntuhan itu adalah kemenangan algoritma, bukan perkakasan. Ia adalah formula yang lebih baik. Ia berjalan pada GPU, dan ia berjalan sama baik pada CPU — np.correlate ditambah gather, dalam fp64. Pegang itu kuat-kuat: faktor tunggal terbesar dalam tajuk utama multi-TF adalah penulisan semula yang tersedia kepada mesin tanpa sebarang GPU. Apabila kami akhirnya menguraikan 167x itu, inilah 27x itu.
Kelebihan tumbuh dengan saiz kelompok

Kini pengukuran yang disuruh oleh roofline untuk kita buat. Ambil paksi yang mahal — prapengiraan HMA jangka masa lebih tinggi terjajar pada siri asas 1-minit, aliran lilin terpanjang yang kami ada — dan suapkan GPU bilangan kombinasi panjang yang semakin meningkat setiap panggilan, . Garis dasar CPU di sini adalah enjin produksi yang jujur: numba dengan prange merentasi kesemua dua belas teras. Bagi setiap kelompok kami mengukur kedua-duanya dan mengambil nisbahnya.
| Kelompok (kombo/panggilan) | Kelajuan GPU berbanding enjin CPU 12-teras |
|---|---|
| 1 | 54.5x |
| 2 | 102.5x |
| 4 | 129.5x |
| 8 | 187.4x |
| 16 | 267.4x |
| 32 | 245.0x |
| 61 | 359.6x |
Ini adalah dilukis dalam pengukuran sebenar. Pada GPU sudah pun 54.5x di hadapan — kerana perbandingan ini adalah terhadap enjin per-bar naif, jadi keruntuhan algoritma sudah terbina di dalamnya walaupun pada satu kombo — tetapi ia jauh daripada silingnya: overhead tetap masih menguasai panggilan satu-kombo. Gandakan kelompok dan kelajuan hampir berganda kepada 102.5x; menjelang ia 267.4x; menjelang ia 359.6x dan jelas masih memanjat. Kelebihan tumbuh dengan saiz masalah. Itulah ayat tunggal paling penting tentang GPU dan sapuan parameter, dan ia adalah bertentangan tepat dengan cara kelajuan GPU biasanya dipetik — seolah-olah ia adalah sifat malar cip itu.
Dua nota kejujuran, kerana ini adalah siri Backtest Tanpa Ilusi dan jadual monoton yang bersih sentiasa layak dicurigai.
Pertama, penurunan itu: membaca 245.0x, di bawah 267.4x pada . Itu bukan bunyi hingar untuk disapu ke bawah permaidani — ia adalah artifak sempadan-chunk. conv1d kami memadatkan 32 panjang ke dalam satu chunk kernel, jadi mengisi tepat satu chunk tanpa kelonggaran, manakala melimpah ke dalam chunk kedua yang kebetulan menepukan peranti dengan lebih baik. Inti roofline adalah trend, dan peranti sebenar mempunyai langkah pengkuantuman di dalamnya; kami melaporkan goyangan itu dan bukannya memilih titik yang cantik sahaja di sekelilingnya.
Kedua, dan lebih penting: 54.5x dan 359.6x kedua-duanya adalah terhadap enjin CPU naif, dan tiada satu pun adalah kemenangan perkakasan. Kedua-dua nombor masih mengandungi keruntuhan algoritma 27x. Jika anda menukar garis dasar CPU kepada algoritma runtuh yang berjalan pada CPU — formula sama, fp64, kedua-dua belah dioptimumkan — setiap baris akan mengecut kira-kira dengan faktor itu. Yang mana adalah tepat penguraian yang dijadikan eksak oleh bahagian seterusnya.
Penguraian jujur: 27x algoritma darab 6.2x perkakasan

Untuk memisahkan algoritma daripada silikon, anda perlu mengukur tiga laluan pada grid pelbagai jangka masa yang sama, bukan dua. Jadi penanda aras itu menjalankan:
- cpu-engine — enjin numba produksi, HMA terjajar per-bar merentasi semua teras. Garis dasar naif-tetapi-selari.
- cpu-collapsed — vektor pemberat runtuh,
np.correlateditambah gather, fp64, pada CPU. Perkakasan sama seperti (1), algoritma lebih baik. - gpu-mlx — pemberat runtuh sebagai
conv1dberkelompok pada GPU Metal, fp32. Algoritma sama seperti (2), perkakasan berbeza.
Bariskan ketiga-tiganya dan tajuk utama pelbagai jangka masa yang penuh berfaktor dengan bersih:
Faktor kiri, 27x, adalah algoritma — keruntuhan per-bar-kepada-konvolusi daripada bahagian sebelumnya. Ia tiada kena mengena dengan GPU. Laksanakan ia dalam numpy dan CPU laptop anda menjadi 27x lebih pantas pada beban kerja ini dengan harga satu refactor. Faktor kanan, 6.2x, adalah perkakasan — kemenangan jujur dan setanding GPU Metal berbanding algoritma teroptimum yang sama pada dua belas teras CPU. 6.2x itu adalah satu-satunya bahagian yang anda benar-benar memerlukan GPU untuk memperolehnya.
Inilah keseluruhan moral artikel ini dinyatakan sebagai aritmetik. Apabila penanda aras vendor, README pustaka, atau rakan sekerja yang teruja menunjukkan anda "167x pada GPU," refleksnya sepatutnya satu soalan tunggal: apakah garis dasar CPU itu? Jika garis dasar itu adalah pelaksanaan naif — dan ia hampir selalu begitu, kerana garis dasar yang perlahan menjadikan slaid yang lebih baik — maka sebahagian besar tajuk utama itu adalah kemenangan algoritma yang CPU juga berhak mendapatnya, dan hanya bakinya adalah perkakasan. Di sini bakinya adalah 6.2x. Petikan 167x melebih-lebihkan sumbangan perkakasan kira-kira 27 kali ganda.
Dan perhatikan bagaimana faktor perkakasan itu sendiri bergerak dengan saiz masalah. Pada sapuan jangka masa tunggal yang kecil, kemenangan sebenar GPU-berbanding-CPU-terbaik adalah 3.2x. Pada prapengiraan pelbagai jangka masa yang lebih besar ia adalah 6.2x — dua cip yang sama, kelebihan perkakasan hampir berganda, semata-mata kerana beban kerja yang lebih besar menolak lebih jauh ke atas roofline menuju siling pengiraan rata GPU sebelum CPU dapat mengejar. Kelebihan perkakasan juga bukan pemalar. Ia adalah titik pada keluk menaik yang sama, dan cara anda bergerak ke kanan pada keluk itu adalah dengan menjadikan kelompok lebih besar dan kerja per-kombo lebih kaya.
Panduan keputusan: berapa lebar sapuan perlu?

Lipat roofline kembali menjadi keputusan yang boleh anda buat sebelum berbelanja. GPU berbaloi apabila kedua-dua syarat roofline dipenuhi serentak: sapuan anda berada di kanan rabung kelompok (, jadi overhead pelancaran-dan-pemindahan tetap diamortisasi), dan kerja per-kombo anda cenderung-pengiraan (keamatan aritmetik cukup kaya untuk mencapai siling rata, bukan laluan O(n) yang nipis). Secara konkrit, daripada apa yang kami ukur:
- Beberapa puluh kombo strategi jangka masa tunggal: langkau GPU. Anda berada di kiri rabung; kemenangan jujur berbanding numba selari adalah ~3.2x pada kerja yang sudah pun mengambil sepersepuluh saat. Kesesakan bukan kernel itu, tetapi segala-galanya di sekelilingnya.
- Beribu-ribu kombo, atau prapengiraan yang benar-benar pelbagai jangka masa / pelbagai penunjuk: GPU memperoleh tempatnya. Overhead diamortisasi, konvolusi terkongsi menaikkan keamatan aritmetik, dan kemenangan perkakasan memanjat kepada 6.2x dan terus meningkat dengan kelompok. Inilah rejim di mana GPU menukar sapuan semalaman menjadi rehat kopi.
- Panjat tangga CPU dahulu — ia lebih murah dan ia datang dahulu. 298x pada CPU dan keruntuhan algoritma 27x adalah percuma atau hampir percuma, dan ia adalah prasyarat, bukan alternatif: 6.2x GPU adalah di atas algoritma runtuh, yang anda terpaksa tulis juga. GPU yang dibaut pada saluran paip naif kebanyakannya mengukur kenaifan itu.
Ada juga cukai pada cabang GPU yang tiada kena mengena dengan kelajuan, dan anda mesti memasukkannya dalam harga: GPU Metal Apple langsung tiada fp64. Segala-galanya berjalan dalam fp32, ketepatan relatif ~1.2e-7. Itu membunuh helah buku teks untuk purata bergerak pantas — WMA jumlah-awalan (prefix-sum) O(n) — kerana pada skala harga berhampiran 30,000 merentasi 150k bar, jumlah berjalan mencapai ~1e14, tujuh order magnitud melepasi julat integer selamat fp32; kami mengukur ralat relatif sehingga ~2e2 (faktor dua ratus, bukan dua peratus). Rumusan yang berfungsi adalah konvolusi bertetingkap langsung, di mana setiap jumlah tetingkap adalah bilangan terbatas sebutan bersaiz setanding dan fp32 kekal tepat hingga ~8e-7. Walaupun begitu, strategi yang membuat keputusan berdasarkan tanda hma - hma3 sesekali akan menterbalikkan silang pada bar sempadan di mana dua keluk itu hampir bersentuhan, kerana pembundaran fp32 menyondongkan seri-hampir. Itulah sebabnya laluan GPU dihantar dengan get kesetaraan yang mengukur berapa banyak dagangan menyimpang — delta PnL dalam basis point, anjakan relatif dalam bilangan dagangan — dan bukannya menegaskan output identik-bit yang tidak akan dapat dihasilkannya. Pada larian kami, penyimpangan itu adalah 90 pengisian teranjak daripada 479,016 (0.019%), jauh di dalam toleransi, tetapi bebannya nyata: pergi ke GPU bermakna memiliki cerita pariti berangka, bukan sekadar jam yang lebih pantas. Kos kejuruteraan itu juga sebahagian daripada titik pulang modal.
Nombor-nombornya berbentuk Apple; keluknya tidak
Setiap angka di atas adalah Apple M2 Max: peranti memori bersatu di mana GPU dan CPU berkongsi satu kolam, dan GPU fp32-sahaja tanpa ketepatan berganda. Kad NVIDIA atau AMD diskret mengubah pemalar-pemalar itu, dan berbaloi untuk jelas tentang arah mana setiap satu bergerak, kerana bentuk hujah itu terus hidup walaupun nombornya tidak.
- Overhead pemindahan menjadi lebih teruk, bukan lebih baik. Kad diskret duduk di belakang PCIe, jadi input dan keputusan membuat salinan sebenar merentasi bas yang dielakkan oleh memori bersatu. Itu menolak rabung kelompok ke kanan — anda memerlukan sapuan yang lebih lebar lagi sebelum GPU diskret mengamortisasi pelancarannya. Tepi kiri roofline lebih curam pada peranti PCIe, bukan lebih landai.
- Siling rata menjadi lebih tinggi. GPU pusat data mempunyai jauh lebih banyak FLOP/s dan lebar jalur daripada yang bersepadu, jadi kemenangan perkakasan asimptotik pada sapuan yang menepu adalah lebih besar daripada 6.2x kami. Ganjaran untuk mencapai sebelah kanan keluk itu tumbuh; tol untuk duduk di sebelah kiri juga tumbuh.
- fp64 kembali, dan bersamanya helah jumlah-awalan. Pada kad dengan ketepatan berganda sebenar, WMA jumlah-awalan O(n) berdaya maju semula dan get pariti boleh diketatkan menuju ketepatan-bit. Cukai fp32 khusus yang kami bayar — konvolusi langsung dan bukannya jumlah awalan, get pengukur-penyimpangan dan bukannya assert — adalah perincian Apple Silicon, bukan hukum.
Tiada satu pun daripada ini mengubah tesisnya. Pada mana-mana peranti, : overhead tetap yang mesti anda amortisasi, asimptot yang anda hampiri hanya dari kanan. Pemalarnya adalah perkakasan; keluknya adalah aritmetik. Ukur , , dan anda sendiri dengan sapuan kelompok lima-baris sebelum anda mempercayai tajuk utama sesiapa — termasuk kami.
Di mana ini bersambung
Ini adalah pengukuran keempat dalam sub-siri kecil tentang dari mana kelajuan backtest sebenarnya datang, dan kepingan-kepingannya tersusun menjadi satu hujah tunggal tentang apa yang perlu dioptimumkan sebelum anda berbelanja:
- Tangga kelajuan memanjat daripada pandas kepada numba selari untuk 298x pada CPU sahaja, dan meninggalkan GPU sebagai soalan terbuka. Artikel ini menjawabnya: GPU adalah anak tangga kelima yang nyata tetapi bersyarat, bernilai 3.2x–6.2x berbanding anak tangga CPU teratas, dan hanya apabila sapuan cukup lebar untuk memanjat roofline.
- Cukai IPC membuat langkah yang sama pada arah bertentangan — mengukur kos untuk meninggalkan proses — dan mencapai bentuk kesimpulan yang sama: sempadan itu (soket, pelancaran GPU) murah; cukainya ada pada berapa kerap dan berapa cerewetnya anda melintasinya. Kelompokkan panggilan GPU anda atas sebab yang sama anda mengelompokkan IPC anda: untuk mengamortisasi kos tetap per-lintasan.
- Cache parquet teragregat adalah versi sisi-CPU bagi apa yang dilakukan prapengiraan GPU — kira penunjuk terkongsi sekali, guna semula merentasi setiap kombo. GPU cuma membawa prinsip guna-semula-dan-kelompok itu ke silikon.
- Dan get pariti fp32 adalah masalah pariti backtest-live dalam bentuk mini: saat laluan pantas anda mengira sesuatu yang sedikit berbeza daripada rujukan anda, anda terhutang akaun penyimpangan yang terkuantifikasi, bukan lambaian tangan.
Disiplin penghubungnya adalah yang sama yang ditolak oleh keseluruhan siri ini: ukur benda yang sebenarnya sedang dijual kepada anda. Kelajuan adalah nisbah, dan nisbah mempunyai pengangka dan penyebut. Kebanyakan kekecewaan GPU datang daripada penyebut — garis dasar CPU — yang dipilih untuk membodek, dan kebanyakan pembaziran GPU datang daripada menjalankan sapuan yang terlalu kecil untuk meninggalkan tepi kiri roofline.
Kesimpulan
- Kelajuan GPU adalah keluk, bukan nombor. Pada prapengiraan pelbagai jangka masa kami, kelebihan berbanding CPU berjalan daripada 54.5x pada satu kombo setiap panggilan kepada 359.6x pada enam puluh satu — cip sama, data sama. Mana-mana angka tunggal adalah titik pada keluk itu; tanya pada saiz kelompok berapa ia diukur.
- Sentiasa soal siasat garis dasar CPU. Tajuk utama pelbagai jangka masa 167x berfaktor dengan bersih kepada 27x algoritma (keruntuhan per-bar-kepada-konvolusi, yang mempercepatkan CPU sama banyak) darab 6.2x perkakasan sebenar. Kemenangan adil GPU-berbanding-CPU-terbaik di sini adalah 3.2x jangka masa tunggal, 6.2x pelbagai jangka masa — bukan 167x.
- Kelebihan tumbuh dengan saiz masalah, dan begitu juga faktor perkakasan. Kelompok lebih besar dan kerja per-kombo lebih kaya menolak anda ke atas roofline: kemenangan perkakasan jujur itu sendiri naik daripada 3.2x kepada 6.2x semata-mata dengan menjadikan beban kerja lebih besar. Sapuan kecil duduk di kiri rabung dan hampir tidak mendapat manfaat.
- Betulkan algoritma dan panjat tangga CPU dahulu — kemenangan GPU duduk di atasnya, bukan menggantikannya. 6.2x itu diukur terhadap algoritma runtuh yang anda terpaksa tulis juga. Bautkan GPU pada saluran paip naif dan kebanyakan apa yang anda ukur adalah kenaifan itu, bukan silikon.
- Pergi ke GPU bermakna memiliki cerita pariti berangka. Tiada fp64 pada Metal, helah WMA jumlah-awalan mati pada skala harga (ralat relatif ~2e2), dan strategi tanda-silang terbalik pada bar sempadan. Hantar get kesetaraan yang mengkuantifikasi penyimpangan dalam basis point; kira kos kejuruteraan itu dalam titik pulang modal anda.
Apabila seseorang memberitahu anda GPU menjadikan backtest mereka seratus kali lebih pantas, mereka hampir tidak memberitahu anda apa-apa. Tanya mereka saiz kelompok dan garis dasar CPU, dan seratus itu biasanya terurai menjadi kemenangan perkakasan satu-digit yang membalut kemenangan algoritma yang boleh mereka perolehi secara percuma — berbaloi dimiliki, pada sapuan yang cukup besar, atas sebab-sebab tepat yang dikatakan roofline dan tiada satu sebab lebih.
Pengarang
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.