#sse #visual-studio-debugging
#visual-studio #sse #visual-studio-debugging #cpu-регистры
Вопрос:
Мне трудно интерпретировать значение регистров xmm в окне регистра Visual Studio. В окнах отображается следующее :
XMM0 = 00000000000000004018000000000000 XMM1 = 00000000000000004020000000000000
XMM2 = 00000000000000000000000000000000 XMM3 = 00000000000000000000000000000000
XMM4 = 00000000000000000000000000000000 XMM5 = 00000000000000000000000000000000
XMM6 = 00000000000000000000000000000000 XMM7 = 00000000000000000000000000000000
XMM00 = 0.00000E 000 XMM01 = 2.37500E 000 XMM02 = 0.00000E 000
XMM03 = 0.00000E 000 XMM10 = 0.00000E 000 XMM11 = 2.50000E 000
XMM12 = 0.00000E 000 XMM13 = 0.00000E 000
Из кода, который я запускаю, значение XMM0 и XMM1 должно быть 6 и 8 (или наоборот). Здесь показано значение регистра : XMM01 = 2.37500E 000
Что это означает?
Ответ №1:
Да, это выглядит как:
XMM0 = { 6.0, 0.0 } // 6.0 = 0x4018000000000000 (double precision)
XMM1 = { 8.0, 0.0 } // 8.0 = 0x4020000000000000 (double precision)
Причина, по которой у вас возникают проблемы с интерпретацией этого, заключается в том, что ваш отладчик отображает каждый 128-битный регистр XMM только в шестнадцатеричном формате, а затем ниже, в виде 4-кратных значений с плавающей точкой одинарной точности, но вы, очевидно, используете значения с плавающей точкой двойной точности.
Я не знаком с отладчиком Visual Studio, но в идеале должен быть способ изменить представление ваших регистров XMM — для этого вам, возможно, придется обратиться к руководству или онлайн-справке.
Обратите внимание, что в целом использование двойной точности с SSE редко имеет какое-либо значение, особенно если у вас довольно современный процессор x86 с двумя FPU.
Комментарии:
1. если кто-то наткнется на это через Google, как я. В отладчике Visual Studio находятся двойники,
XMM0DL
XMM0DH
которые отображаются в диалоговом окне «регистры» с включенным «AVX Double».2. Если кто-то хочет увидеть их в VS2017 (я думаю, я использую VS2019), вам нужно использовать окно просмотра, и вы можете добавить
XMM0
с помощью всплывающего окна или уточнитьXMM0.m128_f64
или уточнитьXMM0.m128_f64[1]
3. Обратите внимание, что в целом использование двойной точности с SSE редко имеет какое-либо значение, особенно если у вас довольно современный процессор x86 с двумя FPU. — Это не точно. Для чисто вертикальных задач, которые не требуют перетасовки,
mulpd
/addpd
дает вам вдвое большую пропускную способность, чем scalar, если вы не ограничены пропускной способностью памяти (например, данные загружены в кэш L2 или L1d). 2 / clockmulpd
вдвое больше работы за цикл, чем 2 / clockmulsd
; серверная часть не может запланировать отдельныеmulsd
инструкции для разделения половин одного и того же модуля умножения SIMD.