Тадқиқоти академӣ, забони фаҳмо

Verianla | Тадқиқоти академӣ ва илм ба забони тоҷикӣ

27 сентябр 2026, якшанбе
VERİANLAНашри мустақили илмӣ
Кушодан ё бастани меню
...
Саҳифаи асосӣ / Илмҳои амалӣ / Илми компютер / Шартҳои Нимастатикӣ дар C++-и Камтаъхир барои Савдои Басомади Баланд: Беҳтар аз Ишораҳои Пешгӯии Шоха
Илми компютер

Шартҳои Нимастатикӣ дар C++-и Камтаъхир барои Савдои Басомади Баланд: Беҳтар аз Ишораҳои Пешгӯии Шоха

Шарти нимастатикӣ (semi-static condition) сохтори идоракунии ҷараёни C++ мебошад, ки ҳангоми тағйир додани самти иҷрочии интихобшаванда дар вақти иҷро, барои аз байн бурдани зарурати арзёбии анъанавии шохаи шартӣ дар роҳи кодии ҳассос ба таъхир, ҳадафи ҷаҳиши нисбии дохили коди мошинии файли иҷрошавандаро ҳангоми кор тағйир медиҳад.

16/09/2026  Veri Anla 73 боздид
Шартҳои Нимастатикӣ дар C++-и Камтаъхир барои Савдои Басомади Баланд: Беҳтар аз Ишораҳои Пешгӯии Шоха

Шарти нимастатикӣ (semi-static condition) сохтори идоракунии ҷараёни C++ мебошад, ки ҳангоми тағйир додани самти иҷрочии интихобшаванда дар вақти иҷро, барои аз байн бурдани зарурати арзёбии анъанавии шохаи шартӣ дар роҳи кодии ҳассос ба таъхир, ҳадафи ҷаҳиши нисбии дохили коди мошинии файли иҷрошавандаро ҳангоми кор тағйир медиҳад. Равише, ки аз ҷониби Paul Alexander Bilokon, Maximilian Lucuta ва Erez Shermer таҳия шудааст, арзёбии гарони шарт ва тағйир додани коди мошиниро ба роҳи ғайрикритикӣ аз нигоҳи иҷро мегузаронад ва дар айни ҳол мекӯшад, ки даъвати branch-ро дар роҳи критикӣ ба ҷаҳиши нисбӣ бо хароҷоти наздик ба даъвати мустақими функсия табдил диҳад.

Ғояи асосии таҳқиқот ин аст, ки ба ҷойи кӯшиши беҳтар кардани пешгӯии ҳар як шохаи шартӣ аз ҷониби протсессорҳои муосир, дар баъзе сенарияҳои истифода шохаи шартие, ки бояд пешгӯӣ шавад, аз роҳи критикии иҷро комилан хориҷ карда шавад. Барои ин амали set_direction пешакӣ муайян мекунад, ки кадом функсия иҷро мешавад ва офсети мувофиқи ҷаҳиши нисбии 32-bit-ро ба коди иҷрошаванда менависад; баъдан даъвати branch бидуни арзёбии дубораи шарт ба ҳамон ҳадаф мегузарад.

Дар микробенчмаркҳои анҷомшуда дар Intel Core i7-10700 хароҷоти медиании даъвати мустақими функсия 9 даври CPU, медиани даъвати нимастатикии branch 10 давр ва инҳирофи стандартии ҳар ду 1 давр чен карда шудааст. Дар озмоиши роҳи “гарм”-и дуҷонибаи монанд ба HFT, ки тасодуфӣ ва душворпешгӯӣ буд, бе гармкунии кэш шохабандии анъанавии шартӣ медиани 75 давр ва инҳирофи стандартии 10 давр нишон дод, дар ҳоле ки шартҳои нимастатикӣ медиани 63 давр ва инҳирофи стандартии 3 давр доштанд. Бо гармкунии кэш қиматҳо мутаносибан 68±8 ва 62±2 давр буданд.

Ин бартарӣ бечунучаро нест. Тағйир додани коди мошинии иҷрошаванда метавонад механизмҳои self-modifying code (SMC)-ро фаъол кунад. Дар озмоише, ки коди тағйирёфта фавран пас аз тағйири assembly иҷро шуд, таъсирҳои SMC machine clear вақти иҷроиро тақрибан 30–40 маротиба зиёд карданд ва ҷаримаҳои иловагии тақрибан 100 давр мушоҳида шуданд. Аз ин рӯ, усул барои ҳалқаҳои зиче, ки самти branch зуд-зуд тағйир ёфта, фавран баъд аз он иҷро мешавад, мувофиқ нест. Модели истифодаи пешниҳодшудаи таҳқиқот ин аст, ки амали гарони set_direction ба роҳи “сард” бурда шавад ва амали арзони branch дар роҳи “гарм”-и ҳассос ба таъхир истифода гардад.

Шарти Нимастатикӣ Чист?

Шарти нимастатикӣ сохтори барномавии идоракунии ҷараён аст, ки арзёбии шарт ва иҷрои шохаи интихобшудаи кодро ба ду амали ҷудогонаи вақтӣ тақсим мекунад ва сипас шохаи интихобшударо тавассути ҷаҳиши нисбии коди мошин даъват мекунад. Ҷанбаи “статикӣ” ин аст, ки ҳангоми даъвати критикии branch ҳадаф аллакай муайян шудааст; ҷанбаи “ним” ин аст, ки барнома метавонад ин ҳадафро дар вақти иҷро бо set_direction дубора тағйир диҳад.

Мантиқи як ифодаи шартии оддии C++ аз нигоҳи консептуалӣ чунин аст: протсессор шартро мехонад, муқоиса мекунад, ба фармони ҷаҳиши шартӣ мерасад ва branch predictor пешгӯӣ мекунад, ки кадом роҳ интихоб мешавад. Агар пешгӯӣ дуруст бошад, хароҷот кам аст; агар нодуруст бошад, мумкин аст фармонҳои ба таври спекулятивӣ овардашуда ва қисман коркардшуда тоза карда шаванд.

Дар равиши нимастатикӣ бошад, шарт пеш аз оғоз шудани роҳи критикӣ арзёбӣ мешавад. Барнома муайян мекунад, ки кадом функсия ҳадаф хоҳад буд ва дар нуқтаи вуруди branch майдони displacement-и фармони нисбии jmp-ро тағйир медиҳад. Вақте ҳодисаи критикӣ фаро мерасад, шарт дигар хонда намешавад; ҷараёни идоракунӣ мустақиман ба функсияи пешакӣ интихобшуда мегузарад.

Чаро branch predictor-и классикӣ кофӣ шуморида нашудааст?

Branch predictor-ҳои муосир метавонанд бисёр шохаҳоро бо дақиқии хеле баланд пешгӯӣ кунанд. Таҳқиқот махсусан ба шохаҳое тамаркуз мекунад, ки бо таърихи гузашта ҳамбастагии қавӣ надоранд, ба маълумоти воридотӣ вобастаанд ё аз сабаби нодир иҷро шудан таърихи кофӣ тавлид намекунанд. Ин масъала дар низомҳои камтаъхир ба мисли HFT муҳим аст; зеро роҳи критикӣ мумкин аст доимо фаъол набошад, аммо ҳангоми фаъол шудан бояд то ҳадди имкон таъхири кам ва пешгӯишаванда дошта бошад.

Атрибутҳои [[likely]] ва [[unlikely]]-и C++20 ин масъаларо бо ирсоли бевоситаи фармони “ин шохаро пешгӯӣ кун” ба branch predictor-и сахтафзор ҳал намекунанд. Тавре ки дар манбаъ шарҳ дода шудааст, компилятор ин маълумотро барои тағйир додани ҷойгиршавии код ва тартиби assembly-и роҳҳои эҳтимолии гарм/сард истифода мебарад. Агар тақсимоти воқеии шартҳо баъдтар тағйир ёбад, ин интихоби вақти компилятсия ба таври динамикӣ нав намешавад.

Шартҳои Нимастатикӣ Аз Пешгӯии Шоха Чӣ Гуна Фарқ Мекунанд?

Шартҳои нимастатикӣ ба ҷойи кӯшиши беҳтар пешгӯӣ кардани натиҷаи шохаи шартӣ, фармони шохаи шартиро дар роҳи критикӣ ба ҷаҳиши мустақими нисбие табдил медиҳанд, ки самташро барномасоз тағйир дода метавонад. Ҳамин тавр, ба ҷойи хатоҳои классикии пешгӯии шохаи шартӣ, ки дар марҳилаи execute муайян мешаванд, ислоҳоти ҳадафи BTB/BAC меоянд, ки ҳангоми тағйири ҳадаф метавонанд дар марҳилаи барвақттар пайдо шаванд.

Сохтори BranchChanger

Абстраксияи асосии прототип синфи BranchChanger мебошад. Синф дар оғоз ду суроғаи функсияро қабул мекунад. set_direction(condition) мувофиқи шарти вақти иҷро муайян мекунад, ки кадом ҳадаф фаъол аст; branch(...) бошад ба ҳадафи интихобшуда меравад.

Намудҳои аргумент ва бозгашти функсияҳо тавассути template deduction гирифта мешаванд. Бо ин роҳ имзои нуқтаи вуруди branch бо calling convention-и функсияҳои ҳадаф мувофиқ карда мешавад. Дар манбаъ мушкили ҷобаҷошавии регистр, ки дар аввал аз сабаби эҷоди нишондиҳандаи пинҳонии this аз ҷониби функсияи узвӣ ба вуҷуд омадааст, шарҳ дода шуда, дар прототипи асосӣ статикӣ кардани методи branch интихоб мешавад.

Офсети ҷаҳиши нисбӣ

Дар механизми нисбии jmp/call-и меъмории x86 суроғаи ҳадаф на ҳамчун суроғаи пурра, балки ҳамчун displacement нисбат ба ҷойгиршавии ҷории фармон кодгузорӣ мешавад. Муносибати асосии истифодашуда дар манбаъ чунин аст:

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

Jump Offset масофаи нисбиест, ки ба фармони мошин навишта мешавад. Target Address суроғаи вуруди функсияи if/else мебошад, ки бояд иҷро шавад. Entry Point нуқтаи вуруди branch-и тағйирёбандаро, ва Size of Instruction дарозии фармони ҷаҳиши нисбиро ифода мекунад. Дар татбиқи x86 як opcode-и якбайтии e9 ва майдони чорбайтии displacement пас аз он истифода мешавад.

Ин математика нишон медиҳад, ки чаро рафтори branch танҳо ба тағйир додани як тағйирёбандаи Boolean маҳдуд нест. Барнома бо дарназардошти ҷойгиршавии сегменти коди иҷрошаванда, суроғаи функсияи ҳадаф ва дарозии фармон, коди воқеии мошинро тағйир медиҳад.

Коди иҷрошаванда чӣ гуна тағйир дода мешавад?

Фармонҳои мошинӣ одатан дар саҳифаҳои executable/text-и фазои суроғаи виртуалӣ қарор доранд ва барои навиштан бастаанд. Прототип ҳангоми иҷро аз суроғаи функсияи branch саҳифаи мувофиқро пайдо мекунад, бо механизми Linux mprotect иҷозатҳои саҳифаро тағйир медиҳад ва displacement-и ҷаҳиши нисбиро навишташаванда мекунад.

Бо сабаби Address Space Layout Randomization (ASLR) суроғаи воқеии runtime-и коди иҷрошаванда аз пеш собит фарз карда намешавад. Аз ин рӯ, ҳалли суроға ва ҳамоҳангсозии саҳифа ҳангоми кори барнома анҷом дода мешавад.

Чаро Branch-Changing ва Branch-Taking Аз Ҳам Ҷудо Мешаванд?

Ин ду амал ҷудо карда мешаванд, зеро тағйири самти branch навиштан ба хотираи executable-и дар ҳоли корро талаб мекунад ва нисбатан гарон аст; branch-taking бошад, агар ҳолат дуруст омода шуда бошад, метавонад танҳо ба хароҷоти як ҷаҳиши кӯтоҳи нисбӣ, ки ба даъвати мустақими функсия илова мешавад, кам карда шавад. Стратегияи оптимизатсияи манбаъ ин аст, ки амали гарон дар коде, ки ба таъхир ҳассос нест, амортизатсия шавад ва дар роҳи критикӣ танҳо амали арзон боқӣ монад.

Ҷаримаи self-modifying code

Гарчанде протсессорҳо тағйир додани коди иҷрошавандаро дастгирӣ мекунанд, instruction cache, pipeline ва ҳолатҳои дахлдори спекулятивӣ метавонанд бо фармонҳои тағйирёфта номувофиқ шаванд. Озмоишҳои манбаъ нишон доданд, ки танҳо навиштани чор байт ба хотираи executable нисбат ба амали чорбайтии memcpy ба хотираи оддӣ ба таври назаррас гаронтар нест: дар ҳар ду ҳолат медиан тақрибан 9 давр ва инҳирофи стандартӣ 1 давр аст.

Хароҷоти асосии баланд вақте пайдо шуд, ки фармони тағйирёфта пас аз вақти хеле кӯтоҳ иҷро гардид. Дар ин ҳолат протсессор баъд аз ошкор шудани self-modifying code метавонад machine clear эҷод кунад; дар озмоиши манбаъ ин рафтор ба тақрибан ду тозакунӣ/итератсия расид, вақти умумии иҷроиро тақрибан 30–40 маротиба зиёд кард ва таъсири SMC тақрибан 100 давр хароҷоти иловагӣ ба вуҷуд овард.

Ин натиҷа нишон медиҳад, ки шартҳои нимастатикӣ оптимизатсияи умумии drop-in барои ҷойгузини ҳар як ифодаи if нестанд. Агар set_direction ва branch пайдарпай ва доимӣ иҷро шаванд, бартарии асосии усул метавонад аз байн равад.

Таъсири BTB ва BAC

Branch Target Buffer (BTB) сохтори сахтафзориест, ки ба протсессор барои пешгӯӣ кардани он, ки дар мавқеи муайяни program counter шоха вуҷуд дорад ва ҳадаф куҷост, кӯмак мекунад. Branch Address Calculator (BAC) бошад дар санҷиши суроғаи ҳадаф нақш дорад. Вақте ҳадафи нисбии jmp-и шарти нимастатикӣ тағйир меёбад, ҳадафи кӯҳна метавонад дар BTB боқӣ монад.

Дар таҷрибаҳои таҳқиқот ҳадафҳои пайваста тағйирёбанда ислоҳоти BAC-ро зиёд карданд. Вақте буфери ҳисоббарорӣ илова шуд, шумораи ислоҳот тақрибан ду баробар кам шуда, ба тақрибан як ислоҳ дар ҳар итератсия расид. Муаллифон барои ислоҳи BAC тақрибан 2,2 ns, яъне дар протсессори истифодашуда тақрибан 6 давр хароҷоти иловагӣ чен карданд. Ин хароҷот аз ҷаримаи пешгӯии нодурусти шохаи шартӣ камтар аст ва муҳимтар аз ҳама, онро метавон пеш аз кори роҳи критикӣ бо даъвати “warming” пешакӣ пардохт кард.

Branch warming-и фаъол

Яке аз тавсияҳои муҳими манбаъ ин аст, ки баъд аз тағйири самти branch дар роҳи сард бо як даъвати сохта ё бетаъсир методи branch иҷро карда шавад. Ин даъват ба BTB омӯхтани ҳадафи ҷорӣ, гарм шудани маълумоти лозимаи instruction-cache ва дур кардани таъсирҳои SMC аз роҳи критикӣ кумак мекунад. Дар мисоли HFT таҳқиқот инро ба таври консептуалӣ бо даъвати “dummy order” шарҳ медиҳад.

Ҷойгоҳи он дар низоми HFT

Дар меъмории содаи HFT дар Шакли 7-и манбаъ, маълумоти бозор аз қабати шабака ба протоколи молиявӣ, order book ва мантиқи махсуси барнома мерасад; оптимизатсияи пешниҳодкардаи таҳқиқот ба роҳи критикии order-action дар тарафи барномаи махсус нигаронида шудааст. Ин усул техникае нест, ки таъхири шабака, таъхири exchange matching engine ё вақти коркарди худи FPGA-ро мустақиман оптимизатсия кунад.

Амният

Read/write/execute кардани саҳифаи executable-и дар ҳоли кор сатҳи ҳамларо васеъ мекунад. Манбаъ ин хавфро эътироф карда, дар равиши set_direction_safe тавсия медиҳад, ки саҳифа танҳо ҳангоми тағйир навишташаванда шавад ва баъд дубора ба ҳолати read/execute баргардонда шавад. Арзиши ин амал ду system call ва таъхир/jitter-и бештар мебошад. Бинобар ин, дар таҳқиқот байни амният ва таъхири ҳадди ақал як созиши ошкори муҳандисӣ вуҷуд дорад.

Thread safety

Азбаски ҳадафи assembly қисми кодест, ки ҳамаи даъватҳо онро муштарак истифода мекунанд, мумкин аст як thread ҳадафро тағйир диҳад ва ҳамзамон thread-и дигар даъвати branch-ро иҷро кунад. Озмоишҳои манбаъ нишон додаанд, ки бе синхронизатсия, ҳарчанд нодир, шохаи нодуруст метавонад иҷро шавад. Синхронизатсия ба мисли Mutex рафтори дурустро таъмин мекунад, вале қисми муҳими бартарии иҷроиро аз байн мебарад.

Қобили интиқол будан

Китобхона ҳамчун китобхонаи статикӣ бо истифода аз CMake бастабандӣ шудааст. Ҷадвали мувофиқати манбаъ барои Windows x86-64 ва Linux x86-64 бо GCC, MSVC ва Clang, инчунин барои Linux ARM бо GCC ва Clang комбинатсияҳои санҷидашуда/коркунандаро нишон медиҳад. Комбинатсияҳои macOS ҳамчун коркунанда қайд нашудаанд. Махсусан маҳдудиятҳои Apple Silicon Hardened Runtime нисбат ба иҷозатҳои write/execute-и саҳифаҳо ҳамчун монеаи муҳими равиши кунунӣ зикр шудаанд.

Усул ва Натиҷаҳои Таҳқиқот

Таҳқиқот дар ду марҳила гузаронида шудааст. Дар марҳилаи аввал дар сатҳи C++ прототипи BranchChanger, мутобиқати calling convention, template deduction, таҳрири assembly, муҳофизат аз оптимизатсияҳои compiler, relative jump ва механизмҳои қобили интиқол таҳия шудаанд. Дар марҳилаи дуюм ҷузъҳои branch-changing ва branch-taking бо даврҳои CPU, ҳисобкунакҳои иҷро ва микробенчмаркҳои сатҳи баландтар чен карда шуданд.

Муҳити таҳия ва таҷриба

  • Низоми амалиётӣ: Linux, тақсимоти Ubuntu.
  • Компилятор: GCC 13.1.
  • Забони таҳия: Дар бахши таҳияи манбаъ C++20.
  • CPU-и асосии benchmark: Intel Core i7-10700, 2,90 GHz.
  • Иқтидори кэш, ки дар манбаъ зикр шудааст: 256 KB L1 instruction/data, 2 MB L2 ва 16 MB L3.
  • Ченкунии сатҳи поёнии вақт: RDTSC.
  • Сериализатсия: LFENCE.
  • Ҳисобкунакҳои иҷро: Linux perf ва perf_event_open.
  • Озмоишҳои сатҳи баландтар: Google Benchmark.

Дар ченкуниҳои RDTSC барои он ки иҷрои out-of-order-и протсессор фосилаи ченкуниро халалдор накунад, LFENCE истифода шудааст. Хароҷоти худи инфрасохтори ченкунӣ бо такрори зиёди ҳалқаи холии ченкунӣ муайян шуда, аз натиҷаҳои минбаъда тарҳ карда шудааст. Манбаъ дар баъзе озмоишҳои instruction-level тақрибан \(10^7\) такрор истифода кардааст.

Натиҷаҳои асосии benchmark

ОзмоишАнъанавӣ / истинодШарти нимастатикӣМаънои илмӣ
Branch-taking vs даъвати мустақими функсия9 давр, SD=110 давр, SD=1jmp-и иловагии нисбӣ тақрибан як давр фарқ эҷод мекунад.
Роҳи гарми тасодуфии монанд ба HFT, cache warming нест75 давр, SD=1063 давр, SD=3Омехтаи predicted/mispredicted-и шохаи шартӣ тақсимоти васеътар эҷод мекунад.
Роҳи гарми тасодуфии монанд ба HFT, cache warming ҳаст68 давр, SD=862 давр, SD=2Бо кам шудани таъсири кэш тақсимоти роҳи нимастатикӣ тангтар боқӣ мемонад.
Роҳи гарме, ки ҳисобкунии бештар дорад120 давр, SD=10104 давр, SD=3Ҳангоми илова шудани мантиқи ҳамсоя таъсири misprediction нигоҳ дошта мешавад.
switch-и тасодуфии 5 ҳолат30 давр, SD=88 давр, SD=1Хароҷоти Jump-table/indirect-branch бо сатҳи баланди пешгӯии нодуруст зиёд мешавад.
Шохаи пешгӯишаванда; самт ҳар 1000 итератсия тағйир меёбад64 давр, SD=362 давр, SD=2Ҳатто бо кам будани пешгӯии нодуруст, фармонҳои иловагӣ дар роҳи assembly фарқи хурд эҷод мекунанд.

Дар Шакли 16-и манбаъ тақсимоти conditional-branch-и озмоиши дуҷониба бо шартҳои тасодуфӣ бимодалӣ аст. Бе cache warming гурӯҳҳои predicted ва mispredicted тақрибан дар марказҳои 65 ва 78 давр; бо warming тақрибан дар марказҳои 64 ва 80 давр дида мешаванд. Фарқи 13–16 давр байни онҳо андозаи ҷаримаи классикии пешгӯии нодурустро дар меъмории истифодашуда нишон медиҳад.

Тибқи ҳисоби муаллифон, шартҳои нимастатикӣ дар ин таҷриба ба ҳисоби миёна тақрибан 2–4 ns ва дар ҳолате, ки шоха ҳамеша нодуруст пешгӯӣ мешавад, тақрибан 6 ns сарфа кардаанд. Ин қиматҳо кафолати умумии C++ нестанд; онҳо ба протсессори ченшуда, ҷойгиршавии код, ҳолати кэш, компилятор ва сенарияи озмоишӣ вобастаанд.

Чаро [[likely]] ва [[unlikely]] дар шартҳои тасодуфӣ кумак накарданд?

Азбаски дар шартҳои Boolean-и тасодуфан тавлидшуда ду самт тақрибан эҳтимоли баробар доштанд, ҷойгиркунии статикӣ аз ҷониби компилятор рафтори воқеии runtime-ро пешгӯӣ карда натавонист. Дар озмоишҳои манбаъ истифодаи [[likely]] ва [[unlikely]] сатҳи пешгӯии нодурустро кам накард. Ин натиҷа танҳо дар шароити ҳамин тарҳи озмоиш эътибор дорад; маънои онро надорад, ки атрибутҳо дар ҳамаи барномаҳо бетаъсир ҳастанд.

Шохабандии N-роҳа

Манбаъ қайд мекунад, ки дар сохтори тасодуфан интихобшавандаи n-роҳаи if/else ё switch, бо зиёд шудани шумораи вариантҳо пешгӯии ҳадафи дуруст душвортар мешавад. Дар озмоиши switch-и панҷҳолата, Шакли 18-и манбаъ барои switch-и анъанавӣ медиани 30 давр ва инҳирофи стандартии 8 давр; барои шарти нимастатикӣ медиани 8 давр ва инҳирофи стандартии 1 давр гузориш медиҳад. Азбаски шохаҳои истифодашуда дар ин озмоиш функсияҳои холӣ буданд, натиҷаро наметавон мустақиман ҳамчун иҷрои сарбории воқеии истеҳсолӣ маънидод кард.

Дар шохаҳои пешгӯишаванда чӣ рӯй дод?

Вақте шарт ҳар 1000 итератсия як маротиба тағйир дода шуд, conventional branch медиани 64 давр ва инҳирофи стандартии 3 давр, равиши нимастатикӣ бошад медиани 62 давр ва инҳирофи стандартии 2 давр нишон дод; манбаъ барои ин муқоиса \(P<0.000001\) медиҳад. Муаллифон фарқи хурди тақрибан 2–3 даврро ба тартибҳои гуногуни assembly, ки compiler дар роҳҳои branch-и пеш ва ақиб эҷод кардааст, нисбат медиҳанд.

Дар сохторҳои switch таъсири мазкури ҷойгиркунии код бештар намоён буда, дар таҳқиқот гузориш шудааст, ки дар баъзе шароити predictable-switch роҳи нимастатикӣ тақрибан 5–6 давр тезтар буд.

Хароҷоти Branch-changing

Ҳарчанд хароҷоти ҷудошудаи тағйири самти чорбайтӣ кам менамояд, агар суроғаи навишташуда пештар дар сохторҳои instruction cache/pipeline буд, SMC machine clear метавонад ба вуҷуд ояд. Дар сенарияи наздики edit-and-execute манбаъ сустшавии тақрибан 30–40 маротибаро гузориш кардааст. Ин муҳимтарин маҳдудияти тарҳи усул аст.

Тоза кардани сатрҳои дахлдори instruction-cache бо CLFLUSH ва гузоштани буфери ҳисоббарорӣ байни assembly edit ва branch-taking шумораи machine clear-ҳоро кам кард; аммо хароҷотро пурра аз байн набурд. Аз ин рӯ, манбаъ масофаи вақтӣ ва микроархитектурии байни тағйири самт ва branch-taking-ро ҳамчун параметри критикии оптимизатсия баррасӣ мекунад.

Эътимоднокӣ ва ҳамзамонӣ

Дар озмоишҳои дурустии як thread, вақте самт пайваста тағйир дода шуда, шоха фавран иҷро гардид, иҷро шудани функсияи интизоршуда тасдиқ шуд. Дар ҳолати бисёр thread, азбаски навишти assembly интихоби атомии сатҳи баланди branch-ро таъмин намекунад, race condition ба вуҷуд омада метавонад. Синхронизатсия хавфи иҷрои шохаи нодурустро пешгирӣ мекунад, вале муқоисаҳои манбаъ нишон медиҳанд, ки иҷро ба таври назаррас паст мешавад.

Оё Ин Benchmark-ҳо Дар Низоми Воқеии Истеҳсолии HFT Ҳамон Фоидаро Исбот Мекунанд?

Не. Таҳқиқот маълумоти воқеии бозор, инфрасохтори шабакавии истеҳсолӣ, пайвасти exchange ва муҳити пурра танзимшудаи HFT kernel-ро end-to-end benchmark накардааст; натиҷаҳо дар сатҳи CPU ва микробенчмарк, аз озмоишҳое ба даст омадаанд, ки қисман рафтори истеҳсолиро тақлид мекунанд. Аз ин рӯ, бартариҳои сатҳи наносония потенсиали усулро нишон медиҳанд, вале дар низоми воқеии trading ҳамон андозаи фоидаи end-to-end-ро кафолат намедиҳанд.

Муаллифон дар бахши evaluation қайд мекунанд, ки аз сабаби набудани ҳуқуқи root танзимоти kernel ба мисли CPU scaling ва scheduler-ро дар сатҳи низоми воқеии HFT конфигуратсия карда натавонистанд. Онҳо ҳамчунин ошкоро эътироф мекунанд, ки микробенчмаркҳои pseudo-realistic низоми воқеии истеҳсолии trading-ро пурра ифода намекунанд.

Шакли охирини манбаъ барои санҷиши қавитари оянда тарҳи таҷрибаеро пешниҳод мекунад, ки аз server-и алоҳидаи market-data replay, switch-и шабакавӣ бо хусусияти timestamp-и дақиқ, низоми истеҳсолии ченшаванда ва server-и алоҳида барои ҳисоб кардани вақти ҷавоб иборат аст.

Натиҷаҳое, ки таҳқиқот дастгирӣ мекунад

  • Даъвати нимастатикии branch дар меъмории омӯхташуда то хароҷоти иҷроии хеле наздик ба даъвати мустақими функсия кам карда шудааст.
  • Дар branch-ҳое, ки зуд-зуд нодуруст пешгӯӣ мешаванд, вақте branch-changing берун аз роҳи критикӣ нигоҳ дошта шуд, медиани пасттари таъхир ва latency variance-и пасттар чен карда шуд.
  • Ба ҷойи хароҷоти conditional branch misprediction механизмҳои арзонтари ислоҳи ҳадаф метавонанд истифода шаванд.
  • SMC machine clear яке аз маҳдудиятҳои асосии иҷрои равиш аст.
  • Агар тағйири самт ва branch-taking ба қадри кофӣ ҷудо шаванд, хароҷоти гарони тағйирро метавон байни шумораи зиёди даъватҳои арзони branch тақсим кард.
  • Thread safety, амният ва қобили интиқоли платформа маҳдудиятҳои асосии амалӣ мебошанд.

Натиҷаҳое, ки таҳқиқот дастгирӣ намекунад

  • Нишон дода нашудааст, ки шартҳои нимастатикӣ аз ҳар сохтори C++ if ё switch тезтаранд.
  • Нишон дода нашудааст, ки дар ҳар меъмории CPU ҳамон фоидаи даврӣ ё наносониягӣ ба даст меояд.
  • Дар биржаи воқеӣ даромаднокии баландтари савдо ба таври эмпирикӣ чен карда нашудааст.
  • Дар низоми воқеии истеҳсолии HFT таҷрибаи end-to-end market-data-to-order latency анҷом дода нашудааст.
  • Нишон дода нашудааст, ки истифода бо синхронизатсияи thread-safe ҳамон бартарии иҷроиро нигоҳ медорад.
  • Иддао намешавад, ки assembly editing рафтори стандартии C++ аст.
  • Нишон дода нашудааст, ки идоракунии бехатари RWX бе хароҷоти иҷроӣ татбиқ мешавад.

Ёддошт оид ба Манбаъ ва Усул

Унвони аслӣ: Semi-static Conditions in Low-latency C++ for High Frequency Trading: Better than Branch Prediction Hints

Муаллифон: Paul Alexander Bilokon; Maximilian Lucuta; Erez Shermer.

Аффилиатсияҳои preprint: Paul Alexander Bilokon — Department of Computing ва Department of Mathematics, Imperial College London; Maximilian Lucuta — Department of Computing, Imperial College London; Erez Shermer — qSpark LLC, Wilmington, Delaware, ИМА.

Манбаи боршуда: arXiv:2308.14185v1 [cs.PF], 27 августи 2023. Файли боршуда худро ба таври ошкор “A PREPRINT” меномад.

Вазъи нашри баъдӣ: Дар санҷиши библиографӣ тасдиқ шуд, ки таҳқиқот баъдан дар Journal of Parallel and Distributed Computing, Ҷилди 196, Мақолаи 105000 нашр шудааст. DOI-и версияи маҷалла 10.1016/j.jpdc.2024.105000 мебошад. Тафсилоти таҷрибавии ин матни Verianla аз preprint-и боршудаи соли 2023 гирифта шудааст; тағйироти эҳтимолии таҳрирӣ ё илмӣ дар версияи баъдии маҷалла бо манбаи боршуда хомӯшона якҷо карда нашудаанд.

Ношир: Elsevier.

Артефакти нармафзор: Таҳқиқот татбиқи шартҳои нимастатикиро ҳамчун китобхонаи кушодаасос пешниҳод мекунад ва анбори коди манбаъро бо номи maxlucuta/semi-static-conditions нишон медиҳад.

Маблағгузорӣ / бархӯрди манфиатҳо / CRediT: Дар preprint-и боршуда изҳороти ҷудогона ва равшани маблағгузорӣ, бархӯрди манфиатҳо ё саҳми муаллифон бо CRediT муайян нашудааст; азбаски ин бахшҳо дар манбаъ нестанд, пур карда нашудаанд.

Маҳдудияти асосии методологӣ: Натиҷаҳои иҷро аз меъморӣ ва платформа вобастаанд. Benchmark-ҳои асосӣ дар Intel Core i7-10700 анҷом дода шудаанд ва низоми воқеии пурраи истеҳсолии HFT ё муҳити пурраи kernel/network tuning истифода нашудааст. Thread-safe кардани истифодаи бисёр thread хароҷоти синхронизатсия ба вуҷуд меорад. Assembly editing дар доираи стандартии C++ ҳамчун рафтори бехатар таъриф нашудааст ва иҷозатҳои саҳифаҳои executable метавонанд мушкилоти амният/қобили интиқолро ба вуҷуд оранд.

Ёддошти техникии дохили манбаъ: Дар бахши таҳия муҳити C++20/GCC 13.1 зикр шудааст, дар ҳоле ки дар мисоли usage -std=c++17 истифода мешавад. Илова бар ин, шарҳи маҳдудияти дастрасии relative jump ва ифодаи 2 GiB дар паёми хатои runtime ба як шакл навишта нашудаанд. Ин фарқиятҳо аз ҷониби Verianla хомӯшона ислоҳ карда нашудаанд.


Мубодила:

Шарҳҳо пас аз баррасӣ нашр мешаванд.Шарҳи шумо ба раванди тасдиқ фиристода шуда, пас аз пазируфта шудан намоён мегардад.

Шарҳ гузоред

Нишонии почтаи электронии шумо нашр намешавад. Майдонҳои ҳатмӣ бо * нишон дода шудаанд

Иҷозат додан ба кукиҳо таҷрибаи шуморо дар ин сомона беҳтар мекунад. Сиёсати кукиҳо