Akademik tadqiqotlar, tushunarli til

Verianla | O‘zbekcha akademik tadqiqotlar va ilm-fan

27 Sentabr 2026, Yakshanba
VERİANLAMustaqil ilmiy nashriyot
Menyuni ochish yoki yopish
...
Bosh sahifa / Amaliy fanlar / Kompyuter fanlari / Past Kechikishli C++ bilan Yuqori Chastotali Savdoda Yarim-Statik Shartlar: Tarmoqni Bashorat Qilish Koʻrsatmalaridan Yaxshiroq
Kompyuter fanlari

Past Kechikishli C++ bilan Yuqori Chastotali Savdoda Yarim-Statik Shartlar: Tarmoqni Bashorat Qilish Koʻrsatmalaridan Yaxshiroq

Yarim-statik shart (semi-static condition) — bajarilish vaqtida tanlanadigan ijro yoʻnalishini oʻzgartirar ekan, kechikishga sezgir kod yoʻlida anʼanaviy shartli tarmoq baholashiga ehtiyoj qoldirmaslik uchun ishlayotgan bajariluvchi fayl mashina kodidagi nisbiy sakrash nishonini oʻzgartiradigan C++ boshqaruv oqimi tuzilmasidir.

16/09/2026  Veri Anla 74 marta ko‘rildi
Past Kechikishli C++ bilan Yuqori Chastotali Savdoda Yarim-Statik Shartlar: Tarmoqni Bashorat Qilish Koʻrsatmalaridan Yaxshiroq

Yarim-statik shart (semi-static condition) — bajarilish vaqtida tanlanadigan ijro yo‘nalishini o‘zgartirar ekan, kechikishga sezgir kod yo‘lida an’anaviy shartli tarmoq baholashiga ehtiyoj qoldirmaslik uchun ishlayotgan bajariluvchi faylning mashina kodidagi nisbiy sakrash nishonini o‘zgartiradigan C++ boshqaruv oqimi tuzilmasidir. Paul Alexander Bilokon, Maximilian Lucuta va Erez Shermer ishlab chiqqan yondashuv qimmat bo‘lgan shartni baholash va mashina kodini o‘zgartirish amalini unumdorlik jihatidan kritik bo‘lmagan yo‘lga ko‘chirish, kritik yo‘ldagi branch chaqirig‘ini esa to‘g‘ridan-to‘g‘ri funksiya chaqirig‘iga yaqin xarajatli nisbiy sakrashga aylantirishni maqsad qiladi.

Tadqiqotning asosiy g‘oyasi zamonaviy protsessorlarni shartli tarmoqlarni har safar yaxshiroq bashorat qilishga urinishdan ko‘ra, ayrim foydalanish ssenariylarida bashorat qilinishi kerak bo‘lgan shartli tarmoqni kritik ijro yo‘lidan butunlay olib tashlashdir. Buning uchun set_direction amali qaysi funksiya ishlashini oldindan belgilaydi va tegishli 32-bit nisbiy sakrash ofsetini ishlayotgan kod ichiga yozadi; keyin branch chaqirig‘i shartni qayta baholamasdan shu nishonga yo‘naladi.

Intel Core i7-10700 ustida o‘tkazilgan mikrobenchmarklarda to‘g‘ridan-to‘g‘ri funksiya chaqirig‘ining median xarajati 9 CPU sikli, yarim-statik branch chaqirig‘ining mediani 10 sikl va ikkisining standart og‘ishi 1 sikl deb o‘lchangan. Tasodifiy va bashorat qilish qiyin bo‘lgan ikki yo‘nalishli HFT-ga o‘xshash “issiq” yo‘l testida keshni isitmasdan an’anaviy shartli tarmoqlanish 75 sikl median va 10 sikl standart og‘ish ko‘rsatgan bo‘lsa, yarim-statik shartlar 63 sikl median va 3 sikl standart og‘ish ko‘rsatgan. Keshni isitish bilan qiymatlar mos ravishda 68±8 va 62±2 sikl bo‘lgan.

Afzallik shartsiz emas. Ishlayotgan mashina kodini o‘zgartirish self-modifying code (SMC) mexanizmlarini ishga tushirishi mumkin. Assembly o‘zgarishidan darhol keyin o‘zgartirilgan kod bajarilgan testda SMC machine clear ta’sirlari bajarilish vaqtini taxminan 30–40 marta oshirgan va taxminan 100 sikllik qo‘shimcha jazolar kuzatilgan. Shu sababli usul branch yo‘nalishi tez-tez o‘zgartirilib, darhol undan keyin bajariladigan zich sikllar uchun mos emas. Tadqiqot tavsiya qiladigan foydalanish modeli qimmat set_direction amalini “sovuq” yo‘lga ko‘chirish va arzon branch amalini kechikishga sezgir “issiq” yo‘lda ishlatishdir.

Yarim-Statik Shart Nima?

Yarim-statik shart — shartni baholash bilan tanlangan kod tarmog‘ini bajarishni ikki alohida vaqt operatsiyasiga ajratadigan va tanlangan tarmoqni keyinchalik nisbiy mashina-kod sakrashi orqali chaqiradigan dasturiy boshqaruv oqimi tuzilmasidir. “Statik” tomoni kritik branch chaqirig‘i paytida nishonning oldindan belgilangan bo‘lishidir; “yarim” tomoni esa dastur bajarilish vaqtida bu nishonni set_direction bilan yana o‘zgartira olishidir.

Oddiy C++ shartli ifodasining mantiqi konseptual ravishda quyidagicha: protsessor shartni o‘qiydi, taqqoslash qiladi, shartli sakrash buyrug‘iga yetadi va branch predictor qaysi yo‘l tanlanishini bashorat qiladi. Bashorat to‘g‘ri bo‘lsa xarajat past; noto‘g‘ri bo‘lsa spekulyativ ravishda olib kelingan va qisman ishlangan buyruqlarni tozalash kerak bo‘lishi mumkin.

Yarim-statik yondashuvda esa shart kritik yo‘l boshlanishidan oldin baholanadi. Dastur qaysi funksiya nishon bo‘lishini aniqlab, branch kirish nuqtasidagi nisbiy jmp buyrug‘ining displacement maydonini o‘zgartiradi. Kritik hodisa yuz berganda shart qayta o‘qilmaydi; boshqaruv oqimi bevosita oldindan tanlangan funksiyaga yo‘naladi.

Nega klassik branch predictor yetarli deb hisoblanmagan?

Zamonaviy branch predictor-lar ko‘plab tarmoqlarni juda yuqori aniqlikda bashorat qila oladi. Tadqiqot ayniqsa tarix bilan kuchli korrelyatsiyasi bo‘lmagan, kiruvchi ma’lumotga bog‘liq yoki kam ishlagani uchun yetarli tarix hosil qilmaydigan tarmoqlarga e’tibor qaratadi. Bu muammo HFT kabi past kechikishli tizimlarda muhim; chunki kritik yo‘l uzluksiz ishlamasligi mumkin, ammo ishlagan paytda imkon qadar past va bashorat qilinadigan kechikishni ta’minlashi kerak.

C++20 dagi [[likely]] va [[unlikely]] atributlari bu muammoni apparat branch predictor-iga bevosita “shu tarmoqni bashorat qil” buyrug‘ini yuborish orqali hal qilmaydi. Manbada tushuntirilganidek, kompilyator bu ma’lumotdan kod joylashuvini va ehtimoliy issiq/sovuq yo‘llarning assembly tartibini o‘zgartirish uchun foydalanadi. Keyinchalik real vaqt shartlar taqsimoti o‘zgarsa, bu kompilyatsiya vaqtidagi tanlov dinamik ravishda yangilanmaydi.

Yarim-Statik Shartlar Tarmoq Bashoratidan Qanday Farq Qiladi?

Yarim-statik shartlar shartli tarmoq natijasini yaxshiroq bashorat qilishga urinmaydi; aksincha, kritik yo‘ldagi shartli tarmoq buyrug‘ini dasturchi tomonidan yo‘nalishi o‘zgartiriladigan bevosita nisbiy sakrashga aylantiradi. Natijada execute bosqichida aniqlanadigan klassik shartli-tarmoq noto‘g‘ri bashoratlari o‘rnini nishon o‘zgartirilganda ertaroq bosqichda yuzaga kelishi mumkin bo‘lgan BTB/BAC nishon tuzatishlari egallaydi.

BranchChanger tuzilmasi

Prototipdagi asosiy abstraksiya BranchChanger sinfidir. Sinf boshlanishida ikki funksiya manzilini oladi. set_direction(condition) bajarilish vaqtidagi shartga ko‘ra qaysi nishon faol bo‘lishini belgilaydi; branch(...) esa tanlangan nishonga o‘tadi.

Funksiyalarning argument va qaytish turlari template deduction orqali olinadi. Shu tariqa branch kirish nuqtasining imzosi nishon funksiyalarning chaqirish konvensiyasiga moslashtiriladi. Manbada oddiy a’zo funksiyaning yashirin this ko‘rsatkichini yaratishi sababli dastlab yuzaga kelgan registr siljishi muammosi tushuntiriladi va asosiy prototipda branch metodini statik qilish tanlanadi.

Nisbiy sakrash ofseti

x86 arxitekturasidagi nisbiy jmp/call mexanizmida nishon manzili to‘liq manzil sifatida emas, balki joriy buyruq joylashuviga nisbatan displacement sifatida kodlanadi. Manbada ishlatilgan asosiy bog‘lanish quyidagicha:

\[ \text{Jump Offset} = \text{Target Address} - \text{Entry Point} - \text{Size of Instruction} \]

Jump Offset — mashina buyrug‘iga yoziladigan nisbiy masofa. Target Address — bajariladigan if/else funksiyasining kirish manzili. Entry Point o‘zgartirilayotgan branch kirish nuqtasini, Size of Instruction esa nisbiy sakrash buyrug‘i uzunligini anglatadi. x86 amalga oshirishida bir baytli e9 opcode va undan keyingi to‘rt baytli displacement maydoni ishlatiladi.

Bu matematika branch xatti-harakati nega faqat Boolean o‘zgaruvchisini almashtirishdan iborat emasligini ko‘rsatadi. Dastur bajariluvchi kod segmenti joylashuvini, nishon funksiya manzilini va buyruq uzunligini hisobga olgan holda haqiqiy mashina kodini o‘zgartiradi.

Ishlayotgan kod qanday o‘zgartiriladi?

Mashina buyruqlari odatda virtual manzil makonidagi executable/text sahifalarida joylashadi va yozish uchun yopiq bo‘ladi. Prototip bajarilish vaqtida branch funksiyasi manzilidan tegishli sahifani topadi, Linux mprotect mexanizmi bilan sahifa ruxsatlarini o‘zgartiradi va nisbiy sakrash displacement-ini yoziladigan holga keltiradi.

Address Space Layout Randomization (ASLR) tufayli bajariluvchi kodning haqiqiy bajarilish vaqti manzili oldindan qat’iy deb olinmaydi. Shu sababli manzilni yechish va sahifani tekislash amallari dastur ishlayotgan paytda bajariladi.

Nega Branch-Changing va Branch-Taking Ajratiladi?

Ikki amal ajratiladi, chunki branch yo‘nalishini o‘zgartirish ishlayotgan executable xotiraga yozishni talab qiladigan nisbatan qimmat amaldir; branch-taking esa to‘g‘ri tayyorlangan holatda faqat bevosita funksiya chaqirig‘iga qo‘shiladigan qisqa nisbiy sakrash xarajatigacha kamaytirilishi mumkin. Manbadagi optimallashtirish strategiyasi qimmat amalni kechikishga sezgir bo‘lmagan kodda amortizatsiya qilish va kritik yo‘lda faqat arzon amalni qoldirishdir.

Self-modifying code jazosi

Protsessorlar ishlayotgan kodni o‘zgartirishni qo‘llab-quvvatlasa-da, instruction cache, pipeline va tegishli spekulyativ holatlar o‘zgartirilgan buyruqlar bilan nomuvofiq bo‘lib qolishi mumkin. Manbadagi testlar faqat executable xotiraga to‘rt bayt yozishning o‘zi oddiy xotiraga to‘rt baytli memcpy amalidan sezilarli qimmat emasligini ko‘rsatgan: ikkala holatda ham median taxminan 9 sikl va standart og‘ish 1 sikl.

Asosiy katta xarajat o‘zgartirilgan buyruq juda qisqa vaqtdan keyin bajarilganda yuzaga kelgan. Bunday holatda protsessor self-modifying code aniqlangandan so‘ng machine clear hosil qilishi mumkin; manba testida bu xatti-harakat taxminan ikki tozalash/iteratsiya darajasiga yetgan, umumiy bajarilish vaqtini taxminan 30–40 marta oshirgan va SMC ta’siri taxminan 100 sikl darajasida qo‘shimcha xarajat keltirgani kuzatilgan.

Bu topilma yarim-statik shartlar har bir if ifodasining o‘rniga ishlatiladigan umumiy drop-in optimallashtirish emasligini ko‘rsatadi. set_direction va branch doim ketma-ket bajarilsa, usulning asosiy afzalligi yo‘qolishi mumkin.

BTB va BAC ta’siri

Branch Target Buffer (BTB) protsessorga ma’lum program counter joylashuvida tarmoq borligini va uning nishoni qayerda ekanini bashorat qilishga yordam beruvchi apparat tuzilmasidir. Branch Address Calculator (BAC) esa nishon manzilini tekshirishda rol o‘ynaydi. Yarim-statik shartning nisbiy jmp nishoni o‘zgartirilganda BTB da eski nishon qolishi mumkin.

Tadqiqot tajribalarida doimiy o‘zgartiriladigan nishonlar BAC tuzatishlarini ko‘paytirgan. Hisoblash buferi qo‘shilganda tuzatishlar soni taxminan yarmiga tushib, iteratsiya boshiga taxminan bittaga teng bo‘lgan. Mualliflar BAC tuzatishi uchun taxminan 2,2 ns, ya’ni ishlatilgan protsessorda taxminan 6 sikl qo‘shimcha xarajat o‘lchagan. Bu xarajat shartli tarmoq noto‘g‘ri bashoratidan past va eng muhimi, kritik yo‘l bajarilishidan oldin “warming” chaqirig‘i bilan oldindan to‘lanishi mumkin.

Faol branch warming

Manbaning muhim tavsiyalaridan biri branch yo‘nalishi o‘zgartirilgandan so‘ng sovuq yo‘lda soxta yoki ta’sirsiz chaqiriq orqali branch metodini ishga tushirishdir. Bu chaqiriq joriy nishonni BTB ga o‘rgatishga, kerakli instruction-cache ma’lumotini isitishga va SMC ta’sirlarini kritik yo‘ldan chetga chiqarishga yordam beradi. HFT misolida tadqiqot buni konseptual ravishda “dummy order” chaqirig‘i bilan tushuntiradi.

HFT tizimidagi o‘rni

Manbaning 7-rasmidagi soddalashtirilgan HFT arxitekturasida bozor ma’lumoti tarmoq qatlamidan moliyaviy protokolga, order book ga va maxsus dastur mantiqiga yetib boradi; tadqiqot taklif qilgan optimallashtirish maxsus dastur tomonidagi order-action kritik yo‘liga qaratilgan. Usul tarmoq kechikishini, exchange matching engine kechikishini yoki FPGA ning o‘z ishlov berish vaqtini bevosita optimallashtiruvchi texnika emas.

Xavfsizlik

Ishlayotgan executable sahifani read/write/execute qilish xavfsizlik yuzasini kengaytiradi. Manba bu xavfni tan olib, set_direction_safe yondashuvida sahifa faqat o‘zgartirish paytida yoziladigan qilinishi, so‘ng yana read/execute holatiga qaytarilishini tavsiya qiladi. Buning narxi ikki tizim chaqirig‘i va yuqoriroq kechikish/jitter hisoblanadi. Demak, tadqiqotda xavfsizlik va eng past kechikish o‘rtasida ochiq muhandislik murosasi mavjud.

Thread safety

Assembly nishoni barcha chaqiriqlar baham ko‘radigan kod qismi bo‘lgani sababli, bir thread nishonni o‘zgartirayotgan vaqtda boshqa thread branch chaqirig‘ini bajarishi mumkin. Manba testlari sinxronizatsiyasiz noto‘g‘ri tarmoq kamdan-kam bo‘lsa ham ishga tushishi mumkinligini ko‘rsatgan. Mutex kabi sinxronizatsiya to‘g‘ri xatti-harakatni ta’minlaydi, ammo unumdorlik afzalligining katta qismini yo‘qqa chiqaradi.

Ko‘chma ishlash

Kutubxona CMake ishlatadigan statik kutubxona sifatida paketlangan. Manbaning moslik jadvali Windows x86-64 va Linux x86-64 da GCC, MSVC va Clang uchun, shuningdek Linux ARM da GCC va Clang uchun sinovdan o‘tgan/ishlaydigan kombinatsiyalarni ko‘rsatadi. macOS kombinatsiyalari ishlaydigan deb belgilanmagan. Ayniqsa Apple Silicon Hardened Runtime ning write/execute sahifa ruxsatlariga qo‘ygan cheklovlari joriy yondashuv uchun muhim to‘siq sifatida qayd etiladi.

Tadqiqot Usuli va Natijalari

Tadqiqot ikki bosqichda olib borilgan. Birinchi bosqichda C++ darajasida BranchChanger prototipi, calling convention mosligi, template deduction, assembly tahriri, compiler optimallashtirishlariga qarshi himoya, relative jump va ko‘chma ishlash mexanizmlari ishlab chiqilgan. Ikkinchi bosqichda branch-changing va branch-taking komponentlari CPU sikllari, unumdorlik hisoblagichlari va yuqori darajali mikrobenchmarklar bilan o‘lchangan.

Ishlab chiqish va tajriba muhiti

  • Operatsion tizim: Linux, Ubuntu distributivi.
  • Kompilyator: GCC 13.1.
  • Ishlab chiqish tili: Manbaning ishlab chiqish bo‘limida C++20.
  • Asosiy benchmark CPU: Intel Core i7-10700, 2,90 GHz.
  • Manbada bildirilgan kesh sig‘imi: 256 KB L1 instruction/data, 2 MB L2 va 16 MB L3.
  • Past darajali vaqt o‘lchovi: RDTSC.
  • Serializatsiya: LFENCE.
  • Unumdorlik hisoblagichlari: Linux perf va perf_event_open.
  • Yuqori darajali testlar: Google Benchmark.

RDTSC o‘lchovlarida protsessorning out-of-order ijrosi o‘lchash oralig‘ini buzmasligi uchun LFENCE ishlatilgan. O‘lchash infratuzilmasining o‘z xarajati bo‘sh o‘lchash siklini ko‘p marta takrorlash orqali aniqlanib, keyingi natijalardan ayirilgan. Manba ayrim instruction-level testlarda taxminan \(10^7\) takrordan foydalangan.

Asosiy benchmark natijalari

TestAn’anaviy / etalonYarim-statik shartIlmiy ma’nosi
Branch-taking vs to‘g‘ridan-to‘g‘ri funksiya chaqirig‘i9 sikl, SD=110 sikl, SD=1Qo‘shimcha nisbiy jmp taxminan bir sikllik farq hosil qiladi.
Tasodifiy HFT-ga o‘xshash issiq yo‘l, cache warming yo‘q75 sikl, SD=1063 sikl, SD=3Shartli tarmoqning predicted/mispredicted aralashmasi kengroq taqsimot hosil qiladi.
Tasodifiy HFT-ga o‘xshash issiq yo‘l, cache warming bor68 sikl, SD=862 sikl, SD=2Kesh ta’siri kamayganda yarim-statik yo‘l taqsimoti torroq bo‘lib qoladi.
Ko‘proq hisoblashni o‘z ichiga olgan issiq yo‘l120 sikl, SD=10104 sikl, SD=3Qo‘shni mantiq qo‘shilganda misprediction ta’siri saqlanadi.
5 holatli tasodifiy switch30 sikl, SD=88 sikl, SD=1Jump-table/indirect-branch xarajatlari yuqori noto‘g‘ri bashorat ulushida ortadi.
Bashorat qilinadigan tarmoq; yo‘nalish har 1000 iteratsiyada o‘zgaradi64 sikl, SD=362 sikl, SD=2Noto‘g‘ri bashorat kam bo‘lsa ham assembly yo‘lidagi qo‘shimcha buyruqlar kichik farq keltiradi.

Manbaning 16-rasmida tasodifiy shartlar bilan o‘tkazilgan ikki yo‘nalishli testning conditional-branch taqsimoti bimodaldir. Cache warming siz predicted va mispredicted klasterlar taxminan 65 va 78 sikl; warming bilan taxminan 64 va 80 sikl markazlarida ko‘rinadi. Oradagi 13–16 sikl farq tadqiqot ishlatgan arxitekturada klassik noto‘g‘ri bashorat jazosi miqdorini ko‘rsatadi.

Mualliflar hisobiga ko‘ra yarim-statik shartlar bu tajribada o‘rtacha taxminan 2–4 ns, tarmoq doim noto‘g‘ri bashorat qilingan holatda esa taxminan 6 ns tejash bergan. Bu qiymatlar umumiy C++ kafolati emas; ular o‘lchangan protsessor, kod joylashuvi, kesh holati, kompilyator va test ssenariysiga xosdir.

Nega [[likely]] va [[unlikely]] tasodifiy shartlarda yordam bermadi?

Tasodifiy yaratilgan Boolean shartlarda ikki yo‘nalish deyarli teng ehtimolli bo‘lgani uchun kompilyatorning statik kod joylashuvi real bajarilish vaqti xatti-harakatini bashorat qila olmagan. Manba testlarida [[likely]] va [[unlikely]] ishlatilishi noto‘g‘ri bashorat ulushini kamaytirmagan. Bu natija faqat shu test tuzilmasi sharoitida amal qiladi; atributlar barcha dasturlarda samarasiz degani emas.

N-yo‘nalishli tarmoqlanish

Manba tasodifiy tanlanadigan n-yo‘nalishli if/else yoki switch tuzilmasida variantlar soni ortgani sayin to‘g‘ri nishonni bashorat qilish qiyinlashishini aytadi. Besh holatli switch testida manbaning 18-rasmi an’anaviy switch uchun 30 sikl median va 8 sikl standart og‘ish; yarim-statik shart uchun 8 sikl median va 1 sikl standart og‘ish beradi. Bu tajribada ishlatilgan tarmoqlar bo‘sh funksiyalar bo‘lgani sabab natijani real ishlab chiqarish ish yukining bevosita unumdorligi sifatida talqin qilib bo‘lmaydi.

Bashorat qilinadigan tarmoqlarda nima bo‘ldi?

Shart har 1000 iteratsiyada bir o‘zgartirilganda conventional branch 64 sikl median va 3 sikl standart og‘ish, yarim-statik yondashuv 62 sikl median va 2 sikl standart og‘ish ko‘rsatgan; manba bu taqqoslash uchun \(P<0.000001\) beradi. Mualliflar taxminan 2–3 sikllik kichik farqni compiler oldinga va orqaga branch yo‘llarida hosil qilgan turli assembly tartiblari bilan bog‘laydi.

Switch tuzilmalarida mazkur kod joylashuvi ta’siri yanada sezilarli bo‘lgan va tadqiqotda ayrim predictable-switch sharoitlarida yarim-statik yo‘l taxminan 5–6 sikl tezroq ekani xabar qilingan.

Branch-changing xarajati

To‘rt baytlik yo‘nalish o‘zgarishining ajratilgan xarajati past ko‘rinsa ham, yozilgan manzil ilgari instruction cache/pipeline tuzilmalarida bo‘lgan bo‘lsa SMC machine clear paydo bo‘lishi mumkin. Tezkor edit-and-execute ssenariysida manba taxminan 30–40 marta sekinlashuvni bildirgan. Bu usul dizaynidagi eng muhim cheklovdir.

CLFLUSH bilan bog‘liq instruction-cache satrlarini tozalash va assembly edit bilan branch-taking orasiga hisoblash buferi qo‘yish machine clear sonini kamaytirgan; biroq xarajatni butunlay yo‘q qilmagan. Shu sababli manba yo‘nalish o‘zgarishi bilan branch-taking orasidagi vaqt va mikroarxitektura masofasini kritik optimallashtirish parametri deb qaraydi.

Ishonchlilik va bir vaqtda bajarilish

Bir thread-li to‘g‘rilik testlarida yo‘nalish doim o‘zgartirilib, tarmoq darhol bajarilganda kutilgan funksiya ishga tushgani tasdiqlangan. Ko‘p thread-li holatda assembly yozuvi atomik yuqori darajali branch tanlovini ta’minlamagani sabab race condition yuzaga kelishi mumkin. Sinxronizatsiya noto‘g‘ri tarmoq bajarilish xavfini bartaraf etadi, ammo manbadagi taqqoslashlar unumdorlik sezilarli darajada pasayishini ko‘rsatadi.

Bu Benchmarklar Haqiqiy HFT Ishlab Chiqarish Tizimida Xuddi Shu Yutuqni Isbotlaydimi?

Yo‘q. Tadqiqot real bozor ma’lumotlarini, ishlab chiqarish tarmoq infratuzilmasini, exchange ulanishini va to‘liq sozlangan HFT kernel muhitini end-to-end benchmark qilmagan; natijalar CPU va mikrobenchmark darajasida, qisman ishlab chiqarish xatti-harakatini taqlid qiluvchi testlardan olingan. Shu sababli nanosoniyalik afzalliklar usul salohiyatini ko‘rsatadi, ammo real trading tizimida xuddi shunday miqyosdagi end-to-end yutuqni kafolatlamaydi.

Mualliflar evaluation bo‘limida root huquqi bo‘lmagani sabab CPU scaling va scheduler kabi kernel sozlamalarini haqiqiy HFT tizimidagi darajada konfiguratsiya qila olmaganini bildiradi. Shuningdek pseudo-realistic mikrobenchmarklar real ishlab chiqarish trading tizimini to‘liq ifodalamayishini ochiq tan oladi.

Manbaning so‘nggi rasmi kuchliroq kelajak validatsiyasi uchun alohida market-data replay serveri, yuqori aniqlikdagi timestamp xususiyatiga ega tarmoq switch-i, o‘lchanadigan ishlab chiqarish tizimi va javob vaqtlarini hisoblaydigan alohida o‘lchov serveridan iborat tajriba tuzilmasini taklif qiladi.

Tadqiqot qo‘llab-quvvatlaydigan natijalar

  • Yarim-statik branch chaqirig‘i o‘rganilgan arxitekturada to‘g‘ridan-to‘g‘ri funksiya chaqirig‘iga juda yaqin bajarilish xarajatigacha tushirilgan.
  • Tez-tez noto‘g‘ri bashorat qilinadigan branch-larda branch-changing kritik yo‘ldan tashqarida saqlana olganda pastroq median kechikish va pastroq latency variance o‘lchangan.
  • Shartli branch misprediction xarajati o‘rniga arzonroq nishon tuzatish mexanizmlaridan foydalanish mumkin.
  • SMC machine clear yondashuvning asosiy unumdorlik cheklovlaridan biridir.
  • Yo‘nalish o‘zgarishi bilan branch-taking yetarlicha ajratilsa, qimmat o‘zgarish xarajati ko‘p sonli arzon branch chaqiriqlariga taqsimlanishi mumkin.
  • Thread safety, xavfsizlik va platforma ko‘chma ishlashi amaliyotdagi asosiy cheklovlardir.

Tadqiqot qo‘llab-quvvatlamaydigan natijalar

  • Yarim-statik shartlar har bir C++ if yoki switch tuzilmasidan tez ekani ko‘rsatilmagan.
  • Har bir CPU arxitekturasida bir xil sikl yoki nanosoniya yutug‘i olinishi ko‘rsatilmagan.
  • Haqiqiy birjada yuqoriroq savdo rentabelligi empirik o‘lchanmagan.
  • Haqiqiy ishlab chiqarish HFT tizimida end-to-end market-data-to-order latency tajribasi o‘tkazilmagan.
  • Thread-safe sinxronizatsiya qo‘shilgan foydalanish bir xil unumdorlik afzalligini saqlashi ko‘rsatilmagan.
  • Assembly editing yondashuvi standart C++ xatti-harakati deb da’vo qilinmaydi.
  • Xavfsiz RWX boshqaruvi unumdorlik xarajatisiz qo‘llanishi ko‘rsatilmagan.

Manba va Usul Haqida Izoh

Asl sarlavha: Semi-static Conditions in Low-latency C++ for High Frequency Trading: Better than Branch Prediction Hints

Mualliflar: Paul Alexander Bilokon; Maximilian Lucuta; Erez Shermer.

Preprint affiliatsiyalari: Paul Alexander Bilokon — Department of Computing va Department of Mathematics, Imperial College London; Maximilian Lucuta — Department of Computing, Imperial College London; Erez Shermer — qSpark LLC, Wilmington, Delaware, AQSh.

Yuklangan manba: arXiv:2308.14185v1 [cs.PF], 27 avgust 2023. Yuklangan fayl o‘zini ochiq ravishda “A PREPRINT” deb ataydi.

Keyingi nashr holati: Bibliografik tekshiruvda tadqiqot keyinchalik Journal of Parallel and Distributed Computing, 196-jild, 105000-maqola sifatida nashr etilgani tasdiqlangan. Jurnal versiyasining DOI-si 10.1016/j.jpdc.2024.105000. Ushbu Verianla matnidagi eksperimental tafsilotlar yuklangan 2023 preprintidan olingan; keyingi jurnal versiyasida bo‘lishi mumkin bo‘lgan tahririy yoki ilmiy o‘zgarishlar yuklangan manba bilan sukutda birlashtirilmagan.

Nashriyot: Elsevier.

Dastur artefakti: Tadqiqot yarim-statik shartlar amalga oshirilishini ochiq manbali kutubxona sifatida taqdim etadi va manba kod repozitoriysini maxlucuta/semi-static-conditions nomi bilan ko‘rsatadi.

Moliyalashtirish / manfaatlar to‘qnashuvi / CRediT: Yuklangan preprintda alohida va aniq moliyalashtirish, manfaatlar to‘qnashuvi yoki CRediT muallif hissasi bayonoti aniqlanmagan; bu maydonlar manbada bo‘lmagani uchun to‘ldirilmagan.

Asosiy metodologik cheklov: Unumdorlik natijalari arxitektura va platformaga bog‘liq. Asosiy benchmarklar Intel Core i7-10700 da o‘tkazilgan, haqiqiy to‘liq miqyosli HFT ishlab chiqarish tizimi va to‘liq kernel/network tuning muhiti ishlatilmagan. Ko‘p thread-li foydalanishni thread-safe qilish sinxronizatsiya xarajatini keltirib chiqaradi. Assembly editing standart C++ doirasida ta’riflangan xavfsiz xatti-harakat emas va executable sahifa ruxsatlari xavfsizlik/ko‘chma ishlash muammolarini keltirib chiqarishi mumkin.

Manba ichidagi texnik izoh: Ishlab chiqish bo‘limi C++20/GCC 13.1 muhitini ko‘rsatgan bo‘lsa, usage misolida -std=c++17 ishlatiladi. Bundan tashqari nisbiy jump yetib borish chegarasi haqidagi izoh bilan runtime xato xabaridagi 2 GiB ifodasi bir xil shaklda yozilmagan. Bu farqlar Verianla tomonidan sukutda tuzatilmagan.


Ulashish:

Izohlar ko‘rib chiqilgandan keyin e’lon qilinadi.Izohingiz tasdiqlash jarayoniga yuboriladi va ma’qullangach ko‘rinadi.

Izoh qoldiring

E-pochta manzilingiz chop etilmaydi. Majburiy maydonlar * bilan belgilangan

Bu saytda cookie-fayllarga ruxsat berish foydalanish tajribangizni yaxshilaydi. Cookie-fayllar siyosati