Nano Hash - криптовалюты, майнинг, программирование

Есть ли связь между регистрами xmm и ymm (x86-64)?

У меня был дамп ядра программы (коммерческой, с закрытым исходным кодом, написанной не мной) по инструкции vmovdqu (%rsi),%xmm2 и я хотел проверить значения регистров в gdb с помощью info regs. Удивительно, но ЦП (24-ядерный процессор AMD EPYC 7401P), кажется, имеет ymm, но не имеет xmm регистров. Я не гуру сборки x86-64, но знаю x86 неплохо.

Кто может объяснить? Версия gdb 10.1.

Вот пример (только начало) дампа реестра:

gdb) info registers all
rax            0x0                 0
rbx            0x104c400           17089536
rcx            0x20                32
rdx            0x35                53
rsi            0x100000000a0       1099511627936
rdi            0x104c400           17089536
rbp            0x100000000a0       0x100000000a0
rsp            0x7ffcc68b0fa8      0x7ffcc68b0fa8
r8             0xffffffff          4294967295
r9             0xffffffff          4294967295
r10            0x5ab               1451
r11            0x35                53
r12            0x100000000a0       1099511627936
r13            0x7ffcc68b2110      140723639492880
r14            0x0                 0
r15            0x0                 0
rip            0x7f877a1dc86b      0x7f877a1dc86b <__strncasecmp_l_avx+91>
eflags         0x10283             [ CF SF IF RF ]
cs             0xe033              57395
ss             0xe02b              57387
ds             0x0                 0
es             0x0                 0
fs             0x0                 0
gs             0x0                 0
st0            0                   (raw 0x00000000000000000000)
st1            0                   (raw 0x00000000000000000000)
st2            0                   (raw 0x00000000000000000000)
st3            0                   (raw 0x00000000000000000000)
st4            0                   (raw 0x00000000000000000000)
st5            0                   (raw 0x00000000000000000000)
st6            0                   (raw 0x00000000000000000000)
st7            0                   (raw 0x00000000000000000000)
fctrl          0x37f               895
fstat          0x0                 0
ftag           0xffff              65535
fiseg          0x0                 0
fioff          0x0                 0
foseg          0x0                 0
fooff          0x0                 0
fop            0x0                 0
mxcsr          0x1fa0              [ PE IM DM ZM OM UM PM ]
ymm0           {
  v16_bfloat16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v8_float = {0x0, 0x0, 0x0, 0xffffffff, 0x0, 0x0, 0x0, 0x0},
  v4_double = {0x0, 0x7fffffffffffffff, 0x0, 0x0},
  v32_int8 = {0x0 <repeats 14 times>, 0xff, 0xff, 0x0 <repeats 16 times>},
  v16_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v8_int32 = {0x0, 0x0, 0x0, 0xffff0000, 0x0, 0x0, 0x0, 0x0},
  v4_int64 = {0x0, 0xffff000000000000, 0x0, 0x0},
  v2_int128 = {0xffff0000000000000000000000000000, 0x0}
}
ymm1           {
  v16_bfloat16 = {0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0, 0xffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v8_float = {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x0, 0x0, 0x0, 0x0},
  v4_double = {0x7fffffffffffffff, 0x7fffffffffffffff, 0x0, 0x0},
  v32_int8 = {0x2f, 0x65, 0x74, 0x63, 0x2f, 0x6f, 0x70, 0x74, 0x2f, 0x6f, 0x6d, 0x6e, 0x69, 0x2f, 0x63, 0x6c, 0x0 <repeats 16 times>},
  v16_int16 = {0x652f, 0x6374, 0x6f2f, 0x7470, 0x6f2f, 0x6e6d, 0x2f69, 0x6c63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v8_int32 = {0x6374652f, 0x74706f2f, 0x6e6d6f2f, 0x6c632f69, 0x0, 0x0, 0x0, 0x0},
  v4_int64 = {0x74706f2f6374652f, 0x6c632f696e6d6f2f, 0x0, 0x0},
  v2_int128 = {0x6c632f696e6d6f2f74706f2f6374652f, 0x0}
}
ymm2           {
  v16_bfloat16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v8_float = {0x0, 0xffffffff, 0xffffffff, 0xffffffff, 0x0, 0x0, 0x0, 0x0},
  v4_double = {0x7fffffffffffffff, 0x7fffffffffffffff, 0x0, 0x0},
  v32_int8 = {0x0, 0x0, 0x0, 0xff <repeats 13 times>, 0x0 <repeats 16 times>},
  v16_int16 = {0x0, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v8_int32 = {0xff000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x0, 0x0, 0x0, 0x0},
  v4_int64 = {0xffffffffff000000, 0xffffffffffffffff, 0x0, 0x0},
  v2_int128 = {0xffffffffffffffffffffffffff000000, 0x0}
}
ymm3           {
  v16_bfloat16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v8_float = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v4_double = {0x0, 0x0, 0x0, 0x0},
  v32_int8 = {0x0 <repeats 14 times>, 0xff, 0x0 <repeats 17 times>},
  v16_int16 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
  v8_int32 = {0x0, 0x0, 0x0, 0xff0000, 0x0, 0x0, 0x0, 0x0},
  v4_int64 = {0x0, 0xff000000000000, 0x0, 0x0},
  v2_int128 = {0xff0000000000000000000000000000, 0x0}
}
...

  • YMMx является расширением XMMx до 256 бит. Та же сделка, что и у RAX против EAX против AX. 29.07.2021
  • Значит, ymm2 содержит то же значение, что и xmm2? 29.07.2021
  • Точно. Его младшие 128 бит — это XMM2. 29.07.2021
  • @oakad Возможно, вы захотите написать ответ (и набрать несколько баллов). 29.07.2021
  • p /x $xmm0.v16_int8 напечатает только часть XMM0. 29.07.2021
  • Два комментария: 1: Я удивлен, что печать xmm0 не является $ymm0.v16_int8, поскольку xmm0 даже не указана. 2: Я снова закрываю вопрос, потому что первая ссылка относится к программированию (не gdb/отладке), а вторая не относится к xmm регистрам. Я думаю, что было бы нормально, если бы ответ ссылался на них, но не как на лучший ответ. 29.07.2021
  • @U.Windl xmm0 не указан в списке так же, как al не указан. Это не значит, что вы не можете распечатать его содержимое. 29.07.2021
  • @fuz Просто нужно знать... 29.07.2021
  • @ У.Виндл Да. Действительно, работа с gdb требует поверхностного знакомства с рассматриваемой ISA. 29.07.2021

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..