А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров icon

А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров




Скачати 118.63 Kb.
НазваА. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров
Дата08.06.2012
Розмір118.63 Kb.
ТипИсследование


МИНИСТЕРСТВО ОБРАЗОВАНИЯ УКРАИНЫ


ДОНЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ


УДК 681.3.004 РГАСНТИ 50.09.33


П.Ю. Гончар, А.Н. Тарасенко


ИССЛЕДОВАНИЕ ОШИБКИ УСТРОЙСТВА С


ПЛАВАЮЩЕЙ ТОЧКОЙ ПРОЦЕССОРОВ


PENTIUM PRO И PENTIUM II


Донецк 1998


Депонированная Рукопись

УДК 681.3.004 РГАСНТИ 50.09.33

Исследование ошибки устройства с плавающей точкой процессоров Pentium Pro и Pentium II/ Гончар П.Ю., Тарасенко А.Н.; Донец. гос. техн. ун–т.-Донецк , 1998.-6 с. Библиогр. 6 назв. –Рус.- Деп.в ГНТБ Украины .


Рассматривается ошибка в FPU процессоров Intel Pentium Pro

и Intel Pentium II, названная Dan-0411 (в Intel Corporation – Flag Erratum) и связанная с преобразованием 80-и разрядного

числа в формате с плавающей запятой в форматы 16-и и 32-х

разрядных целых чисел. Описана суть данной ошибки, а также история обнаружения и исследования. Выполняется исследование на наличие этой ошибки в вышеуказанных процессорах, а также в процессорах, популярных в нашей стране сегодня. Описывается основная идея создания программы на языке ассемблера для исследования этой ошибки. Приведен текст одного из вариантов такой программы, а также результаты ее выполнения на компьютерах с различными процессорами. Данная статья поможет подробно узнать об ошибке Dan-0411, позволит иследовать ее наличие в выбранном процессоре с помощью приведенной программы. При обнаружении этой ошибки статья поможет учесть результаты ее проявления при написании приложений.

Авторы : П.Ю. Гончар

А.Н. Тарасенко


Создание нового современного процессора – очень тонкий и сложный процесс. Все больше и больше людей участвуют в каждой новой разработке. Естественно, что при такой сложности и количестве функциональных элементов неизбежно появление ошибок в работе устройства[1]. Многие из них выявляются и исправляются еще до поступления устройства в продажу,

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

Стала более жесткая конкуренция на рынке процессоров

(даже появился термин “Войны микропроцессоров”) и,

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

очень много времени. Так, не исключением в этом плане стало устройство, разработанное фирмой Intel в 1995 году, а точнее – процессор Intel Pentium Pro[2,3]. Ошибка в FPU этого микропроцессора была обнаружена неким Дэном (свое имя он решил сохранить в тайне) и подробно изучена небезизвестным Робертом Коллинзом (Robert Collins). Эта ошибка была названа Dan-0411 в честь того , кто ее обнаружил. Число 0411 это не что иное, как дата обнаружения ошибки в американской записи (месяц-число-год). То есть 0411 – это 11-ое число 4-го месяца 1997-го года. Фирма Intel узнала об этой ошибке и дала ей свое название: Flag Erratum. Подробнее об истории обнаружения этой ошибки можно узнать на сайте www.x86.org. Эта ошибка была изначально обнаружена в процессорах Intel Pentium Pro, однако позднее выяснилось, что она сохранилась и в более поздних Intel Pentium II. Что касается процессоров Intel Pentium, Intel Pentium-MMX и процессоров других фирм – то Роберт Коллинз заявляет, что в них этой ошибки нет. Целью этой статьи и является проверка наличия данной ошибки в микропроцессорах, популярных в нашей стране.


Суть ошибки Dan-0411 предельно проста. Известно, что можно загрузить в FPU число в формате с плавающей запятой, а выгрузить в память в целом формате. При этом FPU выполняет преобразование форматов. А если выгружаемое из FPU число в целом формате выходит за рамки диапазона ячейки (переменной), выделенной для него в памяти, то есть просто не влезет в разрядную сетку? Например, при сохранении очень большого 80-и разрядного числа c плавающей запятой в 16-и разрядном или 32-х разрядном целом формате. Регистр состояния FPU имеет разряд, названный IE (нулевой разряд FPU Status Word). Это флаг исключения, вызванного некорректной операцией (Invalid operation Exeption). FPU , не имеющий описываемой ошибки, в данной ситуации взводит этот флаг в единицу, а FPU c Dan-0411 - нет. Это и вся проблема. Проблема может показаться еще незначительней, если узнать, что данная ошибка проявляется далеко не на всех числах, а только на 13-и числах при сохранении их в 16-и битном формате и на 9-и числах , при сохранении их в 32-х битном формате. Какие это числа – будет рассказано ниже. Таким образом, по сведениям Роберта Коллинза, вероятность проявления ошибки Dan-0411 при сохранении чисел в 16-и битном целом формате – 2^47/2^80 или 1 из 8’589’934’592, а при сохранении чисел в 32-х битном целом формате – 2^31/2^80 или 1 из 562’949’953’421’312. Как видно, случайно ‘попасть’ на эту ошибку тяжело. Однако такое ‘попадание ‘ случилось, и ,кроме того, фирма Intel признала, что у пользователей Intel Pentium Pro в некоторых играх и графических приложениях может наблюдаться ‘мусор’ на экране. Естественно, что количество ‘сбойных’ чисел и сами эти числа были получены в процессе длительного исследования Робертом Коллинзом, а в этой статье лишь будут использоваться его исследования для самостоятельного исследования наличия этой ошибки в процессорах, находящихся в пользовании в нашем регионе.


Ниже приведен пример, который привел Дэн Роберту Коллинзу, показывающий проявление ошибки Dan-0411:


Example on P6 (Pentium Pro):


FIST[P] m16int c06e80000000000000001 -> 8000 (stored in memory)


FPU status word: B C3 TOP C2 C1 C0 ES SF PE UE OE ZE DE IE


0 0 000 0 0 0 0 0 1 0 0 0 0 0


***FAIL***


Example on P5 (Pentium):


FIST[P] m16int c06e80000000000000001 -> 8000 (stored in memory)


FPU status word: B C3 TOP C2 C1 C0 ES SF PE UE OE ZE DE IE


0 0 000 0 0 0 0 0 0 0 0 0 0 1


***OK***


Из примера видно, что FPU микропроцессора Intel Pentium Pro не возводит флаг IE когда это необходимо. Чтобы исследовать это явление, будем пользоваться инструкцией fnstsw mem16, которая сохраняет содержимое слова состояния FPU в оперативной памяти. Операндом для этой инструкции в языке ассемблера должна являться ячейка памяти, имеющая размер 16 бит. Таким образом, задача исследования ошибки Dan-0411 сводится к последовательному занесению в FPU ‘критических’ чисел, сохранения их в памяти в соответствующем целом формате и после каждого сохранения необходимо записывать содержимое слова состояния FPU в оперативную память, для того чтобы позднее изучить результаты. Также следует отметить, что после каждого такого сохранения необходимо реинициализировать FPU инструкцией fninit. Загружать числа в FPU в формате с плавающей запятой будем с помощью инструкции fld mem80, а сохранять числа в целом 16-и битном формате с помощью fistp mem16, в 32-х битном – с помощью fistp mem32.

Как показали исследования Роберта Коллинза, числа, на которых проявлялась исследуемая ошибка, это:

0c06e8000000000000001h

0c06e8000000000000010h

0c06e8000000000000100h

0c06e8000000000001000h

0c06e8000000000010000h

0c06e8000000000100000h

0c06e8000000001000000h

0c06e8000000010000000h

0c06e8000000100000000h

0c06e8000001000000000h

0c06e8000010000000000h

0c06e8000100000000000h

0c06e80007fffffffffffh

при сохранении в 16-и битном формате и:


0c05e8000000000000001h

0c05e8000000000000010h

0c05e8000000000000100h

0c05e8000000000001000h

0c05e8000000000010000h

0c05e8000000000100000h

0c05e8000000001000000h

0c05e8000000010000000h

0c05e800000007fffffffh

при сохранении в 32-х битном формате.

Так же в программу добавим процедуру вывода на экран шестнадцатиричных чисел, чтобы выводить в цикле текущее ‘критическое’ число, текущее содержимое слова состояния FPU, а также содержимое ячейки памяти, в которую было сохранено число в целом формате. Листинг программы на языке MASM 6.1 с комментариями приведен в приложении А. Кроме того, Роберт Коллинз сам написал программу, производящую вышеописанное тестирование. Ее исходный текст, а также .exe файл могут быть получены на сайте www.x86.org.

Программа, приведенная в приложении А, была запущена на

компьютерах, имеющих популярные микропроцессоры в нашей стране сегодня. Это:

Intel Pentium II 233

Intel Pentium II 300

Intel Pentium-MMX 200

Cyrix 6x86 PR200+

Cyrix 6x86MX PR233

AMD K6 PR200

AMD K5 PR133

AMD 5x86-133

AMD 486DX4-100

AMD 486DX2-66

IDT C6-200

Компьютера, оснащенного микропроцессором Intel Pentium Pro

найти не удалось, в связи с тем, что эти микропроцессоры применяются в основном в серверах и уже устарели. На смену им пришел микропроцессор Intel Pentium II Xeon.

Что касается исследованных микропроцессоров, то результаты выполнения программы на них идентичны и приведены в приложении Б. На всех числах FPU этих микропроцессоров работают правильно и взводят флаг IE в 1.Это видно из шестнадцатиричного числа 0001h, соответствующего содержимому слова состояния FPU(младший бит(IE) этого слова равен 1). При этом число, помещаемое в оперативную память, равно в зависимости от разрядности 8000h или 80000000h, то есть содержит в старшем разряде единицу, а в остальных – ноль. В представлении отрицательных чисел в дополнительном коде это соответствует самому большому отрицательному числу, которое может быть размещено в данной разрядной сетке. То есть, для 16-и разрядной сетки это число 8000h = -32768, а для 32-х разрядной сетки это

80000000h = -2147483648. Как было сказано выше, ошибка была перенесена и в микропроцессор Intel Pentium II,имеющий идентичный с Intel Pentium Pro FPU. «Flag» erratum в списке подобных мелких недостатков процессора Pentium Pro значится в Intel под номером 62, а в списке дефектов Pentium II – под

номером 25. Однако результаты запуска обеих программ на этом микропроцессоре показали, что этой ошибки в нем нет , то есть она была исправлена. FPU этого микропроцессора в этом отношении работает правильно.

Заключение


В процессе исследования ошибки Dan-0411, она же Flag Erratum, было обнаружено, что описанной проблемы уже не существует. Во всяком случае, не было выявлено ни одного процессора, имеющего эту ошибку. Процессоров Intel Pentium Pro все меньше и меньше, а в процессорах Intel Pentium II ошибка обнаружена не была. Что касается остальных процессоров, то они в этом отношении работали правильно изначально.

В нашей программе инструкция fistp была изменена на fist

(Различие в том , что fistp увеличивает содержимое указателя стека FPU на единицу, а fist нет). Интересующие результаты выполнения программы не изменились и приведены в приложении В.





Литература





  1. Р. Вебер “Конфигурирование ПК на процессорах Pentium”, М : Мир 1996.

  2. Гук М. “Аппаратные средства IBM PC. Энциклопедия”: ПитерКом, 1998.

  3. “COMPUTER world Киев”, №19(139), 21 мая 1997г., Киев : Комиздат, С.16.



^

ПРИЛОЖЕНИЕ А




sseg segment stack

db 1024 dup(0) ;Выделяем память под стек

sseg ends


dseg segment

cr db 13,10,'$'

string1 db 13,10,'Testing E-Real to Int16 conversion...',13,10,13,10,'$'

string2 db ' ','$'

string3 db 'Loaded E-Real number Stored int16 FPU Status word',13,10,'$'

string4 db 13,10,'Press any key to continue...',13,10,'$'

string5 db 13,10,'Testing E-Real to Int32 conversion...',13,10,13,10,'$'

string6 db 'Loaded E-Real number Stored int32 FPU Status word',13,10,'$'

Op16 dt 0c06e8000000000000001h

dt 0c06e8000000000000010h

dt 0c06e8000000000000100h

dt 0c06e8000000000001000h

dt 0c06e8000000000010000h

dt 0c06e8000000000100000h

dt 0c06e8000000001000000h

dt 0c06e8000000010000000h

dt 0c06e8000000100000000h

dt 0c06e8000001000000000h

dt 0c06e8000010000000000h

dt 0c06e8000100000000000h

dt 0c06e80007fffffffffffh


Op32 dt 0c05e8000000000000001h

dt 0c05e8000000000000010h

dt 0c05e8000000000000100h

dt 0c05e8000000000001000h

dt 0c05e8000000000010000h

dt 0c05e8000000000100000h

dt 0c05e8000000001000000h

dt 0c05e8000000010000000h

dt 0c05e800000007fffffffh

int16 dw 55aah ;Ячейка для 16-и битного

;целого числа

int32 dd 55aa55aah ;Ячейка для 32-х битного

;целого числа

FPUStatusWord dw 0 ;Ячейка для слова состояния

;FPU

dseg ends


cseg segment

assume cs:cseg,ds:dseg,ss:sseg

main proc near

mov ax, dseg ;Инициализация регистра DS

mov ds,ax


;Осуществляем преобразование Real80 в Int16

lea dx, string1

mov ah,9

int 21h ;Выводим сообщение 1


lea dx, string3

mov ah,9

int 21h ;Выводим сообщение 3

mov cx,0dh ;Счетчик выполненных преобразований

xor si,si ;Смещение относительно начала массива

;`сбойных` чисел(номер числа)

lp1:

fninit ;Инициализация FPU


push cx ;Сохраняем CX

mov di,9 ;Номер байта в выводимом числе

mov cx,0ah ;Кол-во байт в числе


m1: lea bx,Op16[si] ;BX=адрес очередного числа

mov al,[bx+di] ;AL=DI-й байт числа

call write_byte ;Выводим этот байт на экран

dec di ;Следующий байт

loop m1 ;Повторяем для всех байтов числа

call write_space ;Выводим на экран промежуток

pop cx ;Восстанавливаем CX


fld Op16[si] ;Загружаем число в FPU

fistp int16 ;Сохраняем его в памяти как Int16

fnstsw FPUStatusWord ;Сохраняем слово состояния FPU

lea bx, int16 ;BX=адрес ячейки Int16

mov al,[bx+1] ;AL=младшему байту ячейки Int16

call write_byte ;Выводим этот байт на экран

mov al,[bx] ;AL=старшему байту ячейки Int16

call write_byte ;Выводим этот байт на экран

call write_space ;Выводим на экран промежуток

lea bx,FPUStatusWord ;BX=адресу ячейки FPUStatusWord

mov al,[bx+1] ;AL=младшему байту этой ячейки

call write_byte ;Выводим его на экран

mov al,[bx] ;AL=старшему байту этой ячейки

call write_byte ;Выводим его на экран

call write_cr ;Переходим на следующую строку


add si,sizeof Op16 ;Следующее число

loop lp1 ;Повторяем для всех чисел

lea dx,string4

mov ah,9

int 21h ;Выводим сообщение 4

mov ah,1

int 21h ;Ждем нажатия любой клавиши

;Осуществляем преобразование Real80 в Int32

lea dx, string5

mov ah,9

int 21h ;Выводим сообщение 5

lea dx, string6

mov ah,9

int 21h ;Выводим сообщение 6

mov cx,9 ;Кол-во чисел

xor si,si ;Номер числа

lp2:

fninit ;Инициализация FPU

push cx ;Сохраняем СX

mov di,9 ;Номер байта выводимого числа

mov cx,0ah ;Кол-во байт в числе

m2: lea bx,Op32[si] ;BX=адресу текущего числа

mov al,[bx+di] ;AL=текущему байту числа

call write_byte ;Выводим этот байт

dec di ;Следующий байт числа

loop m2 ;Повторяем для всех байтов числа

call write_space ;Выводим на экран промежуток

pop cx ;Восстанавливаем CX


fld Op32[si] ;Загружаем число в FPU

fistp int32 ;Сохраняем его как Int32

fnstsw FPUStatusWord ;Сохраняем слово состояния FPU

lea bx, int32 ;BX=адресу ячейки Int32

mov al,[bx+3] ;AL=младшему байту этой ячейки

call write_byte ;Выводим этот байт на экран

mov al,[bx+2] ;AL=первому байту

call write_byte ;Выводим этот байт

mov al,[bx+1] ;AL=второму байту

call write_byte ;Выводим этот байт

mov al,[bx] ;AL=старшему байту

call write_byte ;Выводим этот байт

call write_space ;Выводим на экран промежуток

lea bx,FPUStatusWord ;BX=адресу ячейки FPUStatusWord

mov al,[bx+1] ;AL=младшему байту

call write_byte ;Выводим его на экран

mov al,[bx] ;AL=старшему байту

call write_byte ;Выводим его на экран

call write_cr ;Переходим на следующую строку


add si,sizeof Op32 ;Следующее число

loop lp2 ;Повторяем для всех чисел

lea dx,string4

mov ah,9

int 21h ;Выводим сообщение 4

mov ah,1

int 21h ;Ожидаем нажатия любой клавиши


mov ah,4ch

int 21h ;Выход в DOS

ret

main endp


write_byte proc near

;Процедура выводит на экран в шестнадцатиричном

;формате байт, размещенный в AL

push dx

push cx

mov dl,al

mov cl,4

shr dl,cl

and dl,00001111b

cmp dl,9

ja above9_1

add dl,30h

jmp output_1

above9_1:

add dl,37h

output_1:

mov ah,2

push ax

int 21h

pop ax

mov dl,al

and dl,00001111b

cmp dl,9

ja above9

add dl,30h

jmp output

above9: add dl,37h

output: mov ah,2

int 21h

pop cx

pop dx

ret

write_byte endp

write_space proc near

;Процедура выводит на экран промежуток в текущей строке

push dx

push ax

lea dx,string2

mov ah,9

int 21h

pop ax

pop dx

ret

write_space endp

write_cr proc near

;Процедура переводит курсор на следующую строку

push dx

push ax

lea dx,cr

mov ah,9

int 21h

pop ax

pop dx

ret

write_cr endp

cseg ends

end main


^

ПРИЛОЖЕНИЕ Б




Testing E-Real to Int16 conversion...


Loaded E-Real number Stored int16 FPU Status word

C06E8000000000000001 8000 0001

C06E8000000000000010 8000 0001

C06E8000000000000100 8000 0001

C06E8000000000001000 8000 0001

C06E8000000000010000 8000 0001

C06E8000000000100000 8000 0001

C06E8000000001000000 8000 0001

C06E8000000010000000 8000 0001

C06E8000000100000000 8000 0001

C06E8000001000000000 8000 0001

C06E8000010000000000 8000 0001

C06E8000100000000000 8000 0001

C06E80007FFFFFFFFFFF 8000 0001


Press any key to continue...

Testing E-Real to Int32 conversion...


Loaded E-Real number Stored int32 FPU Status word

C05E8000000000000001 80000000 0001

C05E8000000000000010 80000000 0001

C05E8000000000000100 80000000 0001

C05E8000000000001000 80000000 0001

C05E8000000000010000 80000000 0001

C05E8000000000100000 80000000 0001

C05E8000000001000000 80000000 0001

C05E8000000010000000 80000000 0001

C05E800000007FFFFFFF 80000000 0001


Press any key to continue...


^

ПРИЛОЖЕНИЕ В




Testing E-Real to Int16 conversion...


Loaded E-Real number Stored int16 FPU Status word

C06E8000000000000001 8000 3801

C06E8000000000000010 8000 3801

C06E8000000000000100 8000 3801

C06E8000000000001000 8000 3801

C06E8000000000010000 8000 3801

C06E8000000000100000 8000 3801

C06E8000000001000000 8000 3801

C06E8000000010000000 8000 3801

C06E8000000100000000 8000 3801

C06E8000001000000000 8000 3801

C06E8000010000000000 8000 3801

C06E8000100000000000 8000 3801

C06E80007FFFFFFFFFFF 8000 3801


Press any key to continue...

Testing E-Real to Int32 conversion...


Loaded E-Real number Stored int32 FPU Status word

C05E8000000000000001 80000000 3801

C05E8000000000000010 80000000 3801

C05E8000000000000100 80000000 3801

C05E8000000000001000 80000000 3801

C05E8000000000010000 80000000 3801

C05E8000000000100000 80000000 3801

C05E8000000001000000 80000000 3801

C05E8000000010000000 80000000 3801

C05E800000007FFFFFFF 80000000 3081


Press any key to continue...

Схожі:

А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconЛекция Типичные ошибки сайтостроителей в этом разделе препарированы типичные ошибки начинающего сайтостроителя по категориям: Дизайн Кодирование Содержание
Описание каждой погрешности сопровождается штрафным баллом, который рекомендуется использовать при формировании совокупной оценки...
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconДегтярев Ю. И. Исследование операций. М.: Высшая школа, 1986. Зайченко Ю. П. Исследование операций
Вентцель Е. С. Исследование операций: Задачи, принципы, методология. М.: Наука, 1980
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconДегтярев Ю. И. Исследование операций. М.: Высшая школа, 1986. Зайченко Ю. П. Исследование операций
Вентцель Е. С. Исследование операций: Задачи,принципы,методология. М.: Наука, 1980
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconДокументи
1. /Курсовая ,,Архитектура процессоров Моторола,,.doc
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconИсследование выпрямительных диодов
Экспериментальное исследование и определение основных параметров схемы однополупериодного выпрямления
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconУгловые колебания упругоопертого кольца уравновешивающего устройства центробежного насоса с учетом местных потерь
Таким образом, начальный перекос и деформации вращающегося и невращающегося диска существенно влияют на работу уравновешивающего...
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconИсследование структурообразования при электрокристал-лизации металлов
Исследование и разработка новых технологий на основе высококонцентрированных источников энергии
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconЗразок оформлення статті
Л. О. Бирюкович, А. Н. Степанчук. Исследование термоэмиссионных свойств сплавов системы LaB6-MeB6 (где Me-Ce,Pr,Nd). В работе проведено...
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconЗразок оформлення статті
Л. О. Бирюкович, А. Н. Степанчук. Исследование термоэмиссионных свойств сплавов системы LaB6-MeB6 (где Me-Ce,Pr,Nd). В работе проведено...
А. Н. Тарасенко исследование ошибки устройства с плавающей точкой процессоров iconОбразец оформления статьи
Л. О. Бирюкович, А. Н. Степанчук. Исследование термоэмиссионных свойств сплавов системы Lab6-Meb6 (где Me-Ce,Pr,Nd). В работе проведено...
Додайте кнопку на своєму сайті:
Документи


База даних захищена авторським правом ©zavantag.com 2000-2013
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації
Документи