Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

cpuid

279
14 марта 2006 года
bave
456 / / 07.03.2004
Нефига не хочет выполнятся команда cpuid:

Сначала пытался делать так :

__asm mov eax,1
__asm cpuid

//...

В этом случае компилятор выдаёт ошибку - говорит, что не знает что такое cpuid
------------------------------------
Потом пытался так:
__asm mov eax,1
__asm _emit 0x0F
__asm _emit 0xA2

//....
В этом случае компилятор не докапывается, но программа вылетает...
(пробовал вместо машинного кода cpuid после _emit
указывать машинный код других команд и все работало нормально, т. е. ИМЕННО cpuid не хочет рпаботать)
1.8K
14 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by bave
Нефига не хочет выполнятся команда cpuid:

Сначала пытался делать так :

__asm mov eax,1
__asm cpuid

//...

В этом случае компилятор выдаёт ошибку - говорит, что не знает что такое cpuid
------------------------------------
Потом пытался так:
__asm mov eax,1
__asm _emit 0x0F
__asm _emit 0xA2

//....
В этом случае компилятор не докапывается, но программа вылетает...
(пробовал вместо машинного кода cpuid после _emit
указывать машинный код других команд и все работало нормально, т. е. ИМЕННО cpuid не хочет рпаботать)


У меня код с кпуйд в VC++ 6.0 компилится на ура...
Прога не падает.
Возможно твой проц не поддерживает эту инструкцию(хотя cpuid появился ещё в 486-х).P(

279
14 марта 2006 года
bave
456 / / 07.03.2004
У меня VC++5.0 ПРоцессор Celeron-1700

Сейчас тоже самое сделал на TASMе - на нём нормально откомпилировалось и нормально работало...
-------------------------------------

А может кто-нибудь подскажет как проверить
наличие расширений SSE и SSE2 без использования
cpuid
1.8K
14 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by bave
У меня VC++5.0 ПРоцессор Celeron-1700

Сейчас тоже самое сделал на TASMе - на нём нормально откомпилировалось и нормально работало...


Напиши код с кпуйд на MASM'е. Сделай либу или объектник и линкуй её(его) к проекту на сях.

Цитата:
Originally posted by bave
А может кто-нибудь подскажет как проверить
наличие расширений SSE и SSE2 без использования
cpuid


Никак. Интеловские мануалы упорно указывают на cpuid для определения поддержки подобных расширений.

252
15 марта 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by k3Eahn
Напиши код с кпуйд на MASM'е. Сделай либу или объектник и линкуй её(его) к проекту на сях.

Никак. Интеловские мануалы упорно указывают на cpuid для определения поддержки подобных расширений.


прерывание(исключение) "недействительная операция" .вызывается если проц не знает или не может выполнить операцию .

1.8K
15 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by koderAlex
прерывание(исключение) "недействительная операция" .вызывается если проц не знает или не может выполнить операцию .


Цитата с agner.org:
7.1 Checking for operating system support for XMM registers
Unfortunately, the information that can be obtained from the CPUID instruction is not
sufficient for determining whether it is possible to use the SSE and SSE2 instructions, which
use the 128-bit XMM registers. The operating system has to save these registers during a
task switch and restore them when the task is resumed. The microprocessor can disable the
use of the XMM registers in order to prevent their use under old operating systems that do
not save these registers. Operating systems that support the use of XMM registers must set
bit 9 of the control register CR4 to enable the use of XMM registers and indicate its ability to
save and restore these registers during task switches. (Saving and restoring registers is
actually faster when XMM registers are enabled).
Unfortunately, the CR4 register can only be read in privileged mode. Application programs
therefore have a serious problem determining whether they are allowed to use the XMM
registers or not. [color=red]According to official Intel documents, the only way for an application
program to determine whether the operating system supports the use of XMM registers is to
try to execute an XMM instruction and see if you get an invalid opcode exception. This is
ridiculous, because not all operating systems, compilers and programming languages
provide facilities for application programs to catch invalid opcode exceptions. The
advantage of using the XMM registers evaporates completely if you have no way of knowing
whether you can use these registers without crashing your software.[/color]
These serious problems led me to search for an alternative way of checking if the operating
system supports the use of XMM registers, and fortunately I have found a way that works
reliably. [color=red]If XMM registers are enabled, then the FXSAVE and FXRSTOR instructions can read
and modify the XMM registers. If XMM registers are disabled, then FXSAVE and FXRSTOR
cannot access these registers. It is therefore possible to check if XMM registers are
enabled, by trying to read and write these registers with FXSAVE and FXRSTOR[/color]. The
subroutines in agner.org/assem/asmlib.zip use this method. These subroutines can be
called from assembly as well as from high-level languages, and provide an easy way of
detecting whether XMM registers can be used.
In order to verify that this detection method works correctly with all microprocessors, I first
checked various manuals. The 1999 version of Intel's software developer's manual says
about the FXRSTOR instruction: "The Streaming SIMD Extension fields in the save image
(XMM0-XMM7 and MXCSR) will not be loaded into the processor if the CR4.OSFXSR bit is
not set." AMD's Programmer’s Manual says effectively the same. However, the 2003
version of Intel's manual says that this behavior is implementation dependent. In order to
clarify this, I contacted Intel Technical Support and got the reply, "If the OSFXSR bit in CR4
in not set, then XMMx registers are not restored when FXRSTOR is executed". They further
confirmed that this is true for all versions of Intel microprocessors and all microcode
updates. I regard this as a guarantee from Intel that my detection method will work on all
Intel microprocessors. We can rely on the method working correctly on AMD processors as
well since the AMD manual is unambiguous on this question. It appears to be safe to rely on
this method working correctly on future microprocessors as well, because any
microprocessor that deviates from the above specification would introduce a security
problem as well as failing to run existing programs. Compatibility with existing programs is of
great concern to microprocessor producers.
The subroutines in agner.org/assem/asmlib.zip are constructed so that the detection
will give a correct answer unless FXSAVE and FXRSTOR are both buggy. My detection
method has been further verified by testing on many different versions of Intel and AMD
processors and different operating systems (Test program available at
agner.org/assem/xmmtest.zip).
The detection method recommended in Intel manuals has the drawback that it relies on the
ability of the compiler and the operating system to catch invalid opcode exceptions. A
Windows application, for example, using Intel's detection method would therefore have to be
tested in all compatible operating systems, including various Windows emulators running
under a number of other operating systems. My detection method does not have this
problem because it is independent of compiler and operating system. My method has the
further advantage that it makes modular programming easier, because a module,
subroutine library, or DLL using XMM instructions can include the detection procedure so
that the problem of XMM support is of no concern to the calling program, which may even
be written in a different programming language. Some operating systems provide system
functions that tell which instruction set is supported, but the method mentioned above is
independent of the operating system.

252
15 марта 2006 года
koderAlex
1.4K / / 07.09.2005
между XMM регистрами и выпольняемыми с ними операциями есть некоторая разница . в конце концов ,кроме SSE есть ещё SSE2 ,SSE3 и амдешные придумки .а если завтра интел сподобится SSE4 припаять ? тогда что ?
1.8K
15 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by koderAlex
между XMM регистрами и выпольняемыми с ними операциями есть некоторая разница . в конце концов ,кроме SSE есть ещё SSE2 ,SSE3 и амдешные придумки .а если завтра интел сподобится SSE4 припаять ? тогда что ?


Вывод один - не стоит изгаляться и искать другой способ определения поддержки SIMD расширений - это того не стоит. Если в TASM'е или VC не получается использовать CPUID - это ещё не повод искать обходные пути.
В конце концов CPUID - документированный и единственно верный метод(если конечно он поддерживается).

260
15 марта 2006 года
Ramon
1.1K / / 16.08.2003
Цитата:
Originally posted by k3Eahn
Вывод один - не стоит изгаляться и искать другой способ определения поддержки SIMD расширений - это того не стоит. Если в TASM'е или VC не получается использовать CPUID - это ещё не повод искать обходные пути.
В конце концов CPUID - документированный и единственно верный метод(если конечно он поддерживается).



А если он не поддерживается......... SSE на трешке - простите;)

252
16 марта 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by k3Eahn
Вывод один - не стоит изгаляться и искать другой способ определения поддержки SIMD расширений - это того не стоит. Если в TASM'е или VC не получается использовать CPUID - это ещё не повод искать обходные пути.
В конце концов CPUID - документированный и единственно верный метод(если конечно он поддерживается).


А бит IE в SWR и MXCSR , исключение #UD - это недокументированно или не верно ?

1.8K
16 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by Ramon
А если он не поддерживается......... SSE на трешке - простите;)


Параллельный вопрос:
А процессоры-суррогаты бывают?

P.S. на деле проверить поддерживает ли третий SSE я не могу...;)

1.8K
16 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by koderAlex
А бит IE в SWR и MXCSR , исключение #UD - это недокументированно или не верно ?


Положим ты купил телевизор. Ты знаешь, что для того чтобы проверить работает ли он тебе
нужно его включить в сеть и нажать кнопку(про это даже будет написано в инструкции пользователя).
И зная это, ты будешь искать другой способ узнать работает ли он:o(к примеру полезешь в него с тестером). Ведь так? Мы ведь лёгких путей не ищем?

P.S. Покой нам только снится?

P.P.S. According to official Intel documents, the only way for an application
program to determine whether the operating system supports the use of XMM registers is to
try to execute an XMM instruction and see if you get an invalid opcode exception. This is
ridiculous, because not all operating systems, compilers and programming languages
provide facilities for application programs to catch invalid opcode exceptions.

252
17 марта 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by k3Eahn
Положим ты купил телевизор. Ты знаешь, что для того чтобы проверить работает ли он тебе
нужно его включить в сеть и нажать кнопку(про это даже будет написано в инструкции пользователя).
И зная это, ты будешь искать другой способ узнать работает ли он:o(к примеру полезешь в него с тестером). Ведь так? Мы ведь лёгких путей не ищем?

P.S. Покой нам только снится?

P.P.S. According to official Intel documents, the only way for an application
program to determine whether the operating system supports the use of XMM registers is to
try to execute an XMM instruction and see if you get an invalid opcode exception. This is
ridiculous, because not all operating systems, compilers and programming languages
provide facilities for application programs to catch invalid opcode exceptions.


1)"Положим ты купил телевизор. Ты знаешь, что для того чтобы проверить работает ли он тебе
нужно его включить в сеть и нажать кнопку(про это даже будет написано в инструкции пользователя)."-" According to official Intel documents, the only way for an application
program to determine whether the operating system supports the use of XMM registers is to
try to execute an XMM instruction and see if you get an invalid opcode exception." - Слов нет .:D
2) Система про произошедшее #UD проге может и не сообщить (это ,кстати, недоработка для оси),но это не существенно.Проверки можно вести и в глухую . CPUID тоже не многие компиляторы поддерживают (см первый постинг) .
3)Прямая проверка выполняется быстрее чем через CPUID ,т.к.процу надо заново заполнить очередь декодированных команд.

15K
17 марта 2006 года
BlueHER
5 / / 14.12.2005
Цитата:
Originally posted by bave
У меня VC++5.0 ПРоцессор Celeron-1700

Сейчас тоже самое сделал на TASMе - на нём нормально откомпилировалось и нормально работало...
-------------------------------------

А может кто-нибудь подскажет как проверить
наличие расширений SSE и SSE2 без использования
cpuid



WinApi функция IsProcessorFeaturePresent

15K
17 марта 2006 года
BlueHER
5 / / 14.12.2005
Цитата:
Originally posted by bave
У меня VC++5.0 ПРоцессор Celeron-1700

Сейчас тоже самое сделал на TASMе - на нём нормально откомпилировалось и нормально работало...
-------------------------------------

А может кто-нибудь подскажет как проверить
наличие расширений SSE и SSE2 без использования
cpuid


Хм. У меня все работает и с CPUID. Лови функцию...

Код:
bool    Processor_Supports_MMX  =   false;//Поддержка процессором инструкций MMX
bool    Processor_Supports_SSE  =   false;//Поддержка процессором инструкций SSE
bool    Processor_Supports_SSE2 =   false;//Поддержка процессором инструкций SSE
bool    Processor_Supports_3DNOW=   false;//Поддержка процессором инструкций SSE2
bool    Processor_Supports_RDTSC=   false;//Поддержка процессором инструкции RDTSC
char    Processor_id_string[13] =   "";   //12-байтная строка - идентификатор производителя процессора

void    __stdcall   CheckProcessorInstructions(void)
{
    //DWORD temp_proc_id[3];//сюда сначала поместится строка[12] с идентификатором производителя
    __asm
    {
        ;//Сначала получим идентификатор производителя процессора
        mov     eax,0
        CPUID
        mov     DWORD ptr Processor_id_string+0 , ebx
        mov     DWORD ptr Processor_id_string+8 , ecx
        mov     DWORD ptr Processor_id_string+4 , edx
       
        ;/////////////////////////////////////////////////////////
        //Потом - проверим поддержку инструкций
        ;//_emit    0x0F    //можно использовать эти две строки машинных кодов
        ;//_emit    0xA2    //вместо CPUID
        mov     eax,1
        CPUID
        ;//test for RDTSC: бит 4 должен быть равен 1
        test    edx,0x00000010
            jz      no_RDTSC
        mov     Processor_Supports_RDTSC,1
    no_RDTSC:
        ;//test for MMX: бит 23 должен быть равен 1
        test    edx,0x00800000 
            jz      no_mmx
        mov     Processor_Supports_MMX,1
    no_mmx:

        ;//test for SSE: бит 25 должен быть равен 1
        test    edx,0x02000000
            jz  no_sse
        mov     Processor_Supports_SSE,1
    no_sse:

        ;//test for SSE2: бит 26 должен быть равен 1
        test    edx,0x04000000
            jz  no_sse2
        mov     Processor_Supports_SSE2,1
    no_sse2:
        ;//test for 3DNOW: бит 25 должен быть равен 1,
        ;//после вызова CPUID с eax старшим битом = 1
        mov     eax,0x80000001
        CPUID
        test    edx,0x00800000
            jz  no_3dnow
        mov     Processor_Supports_3DNOW,1
    no_3dnow:
    }//_asm
    Processor_id_string[12] =   0;
}//CheckProcessorInstructions


Вероятно проблемма в том, что ты вызываешь CPUID с EAX = 1. Так проверяются не интеловские расширения. Для проверки интеловских - Eax = 0. Короче RTFS (читай код и доки)
1.8K
18 марта 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by koderAlex
CPUID тоже не многие компиляторы поддерживают (см первый постинг).


Это не есть проблема(в конце концов есть FASM,MASM и их возможность делать MS COFF'ы) и соответственно это не есть повод отказываться от использования cpuid.

Цитата:
Originally posted by koderAlex
Прямая проверка выполняется быстрее чем через CPUID ,т.к.процу надо заново заполнить очередь декодированных команд.


Если прямая проверка - это через #UD - то разве само по себе исключение(ловушка) не приведёт ли к сбросу конвейера?

252
20 марта 2006 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by k3Eahn
Это не есть проблема(в конце концов есть FASM,MASM и их возможность делать MS COFF'ы) и соответственно это не есть повод отказываться от использования cpuid.

Если прямая проверка - это через #UD - то разве само по себе исключение(ловушка) не приведёт ли к сбросу конвейера?


CPUID приведёт к этому обязательно , а #UD может и не случится .

324
21 марта 2006 года
AndreySar
532 / / 01.08.2004
Посмотри файл, пример из MSDN
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог