Значение значений регистра XMM, отображаемых в окне регистра отладчика Visual Studio

#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 / clock mulpd вдвое больше работы за цикл, чем 2 / clock mulsd ; серверная часть не может запланировать отдельные mulsd инструкции для разделения половин одного и того же модуля умножения SIMD.