core.cpuid
Определяет характеристики процессора хоста, предоставляя информацию о размерах кэша и подсказках по оптимизации ассемблерного кода. Этот модуль предназначен в первую очередь для программистов, использующих ассемблерный язык.
- Ссылки
- Некоторые из этих данных были чрезвычайно трудно найти. Некоторые из документов ниже были найдены только в кэшированных версиях, хранящихся поисковыми системами! Этот код опирается на информацию, найденную в:
- "Справочник разработчика программного обеспечения для архитектур Intel(R) 64 и IA-32, том 2A: Справочник по набору команд, A-M" (2007).
- "Спецификация AMD CPUID", Advanced Micro Devices, Rev 2.28 (2008).
- "Применимое к процессорам AMD до процессоров AMD Family 0Fh. Приложение к процессорам AMD Processor Recognition", Advanced Micro Devices, Rev 3.13 (2005).
- "Книга данных процессоров AMD Geode(TM) GX", Advanced Micro Devices, Publication ID 31505E, (2005).
- "Оптимизация кода процессора AMD K6", Advanced Micro Devices, Rev D (2000).
- "Прикладная заметка 106: Настройка программного обеспечения для семейства 6x86", Cyrix Corporation, Rev 1.5 (1998)
- http://www.datasheetcatalog.org/datasheet/nationalsemiconductor/GX1.pdf
- "Серия процессоров Geode(TM) GX1 Low Power Integrated X86 Solution", National Semiconductor, (2002)
- "Архитектура VIA Isaiah", G. Glenn Henry, Centaur Technology, Inc (2008).
- http://www.sandpile.org/ia32/cpuid.htm
- http://www.akkadia.org/drepper/cpumemory.pdf
- "Что каждый программист должен знать о памяти", Ulrich Depper, Red Hat, Inc., (2007).
- "Идентификация процессора ядром Windows", G. Chappell (2009). http://www.geoffchappell.com/viewer.htm?doc=studies/windows/km/cpu/cx8.htm
- "Идентификация процессоров Intel(R) и инструкция CPUID, Примечание по применению 485" (2009).
- Ошибки:
- В настоящее время работает только на процессорах x86 и Itanium. Многие процессоры имеют ошибки в микрокоде для инструкции CPUID, поэтому информация о кэше может быть некорректной.
- Лицензия:
- Boost License 1.0
- Авторы:
- Don Clugston, Tomas Lindquist Olsen <tomas@famolsen.dk>
- Исходный код
- core/cpuid.d
- struct CacheInfo;
-
Размер и поведение кэша
- size_t size;
-
Размер кэша в килобайтах на процессор. Для объединённых кэшей L1 (данные + код) этот размер равен половине физического размера. (мы не делим пополам для больших размеров, так как обычно размер данных намного больше размера кода для критических циклов).
- ubyte associativity;
-
Количество способов ассоциативности, например:
- 1 = прямое отображение
- 2 = 2-way set ассоциативный
- 3 = 3-way set ассоциативный
- ubyte.max = полностью ассоциативный
- uint lineSize;
-
Количество байтов, считываемых в кэш при промахе.
- CacheInfo[5] datacache;
-
Планируется к устареванию. Используйте
dataCachesвместо этого. - pure nothrow @nogc @property @trusted const(CacheInfo)[5] dataCaches();
-
Данные кэши. Если физических уровней кэша меньше 5, оставшиеся уровни устанавливаются в size_t.max (== весь адресное пространство памяти)
- pure nothrow @nogc @property @trusted string vendor();
-
Возвращает строку производителя, только для отображения. НЕ используйте это для определения функций! Обратите внимание, что некоторые процессоры имеют программируемые идентификаторы производителя.
- pure nothrow @nogc @property @trusted string processor();
-
Возвращает строку процессора, только для отображения.
- pure nothrow @nogc @property @trusted bool x87onChip();
-
Есть ли на чипе FPU x87?
- pure nothrow @nogc @property @trusted bool mmx();
-
Поддерживается ли MMX?
- pure nothrow @nogc @property @trusted bool sse();
-
Поддерживается ли SSE?
- pure nothrow @nogc @property @trusted bool sse2();
-
Поддерживается ли SSE2?
- pure nothrow @nogc @property @trusted bool sse3();
-
Поддерживается ли SSE3?
- pure nothrow @nogc @property @trusted bool ssse3();
-
Поддерживается ли SSSE3?
- pure nothrow @nogc @property @trusted bool sse41();
-
Поддерживается ли SSE4.1?
- pure nothrow @nogc @property @trusted bool sse42();
-
Поддерживается ли SSE4.2?
- pure nothrow @nogc @property @trusted bool sse4a();
-
Поддерживается ли SSE4a?
- pure nothrow @nogc @property @trusted bool aes();
-
Поддерживается ли AES?
- pure nothrow @nogc @property @trusted bool hasPclmulqdq();
-
Поддерживается ли pclmulqdq?
- pure nothrow @nogc @property @trusted bool hasRdrand();
-
Поддерживается ли rdrand?
- pure nothrow @nogc @property @trusted bool avx();
-
Поддерживается ли AVX?
- pure nothrow @nogc @property @trusted bool vaes();
-
Поддерживается ли VEX-Encoded AES?
- pure nothrow @nogc @property @trusted bool hasVpclmulqdq();
-
Поддерживается ли vpclmulqdq?
- pure nothrow @nogc @property @trusted bool fma();
-
Поддерживается ли FMA?
- pure nothrow @nogc @property @trusted bool fp16c();
-
Поддерживается ли FP16C?
- pure nothrow @nogc @property @trusted bool avx2();
-
Поддерживается ли AVX2?
- pure nothrow @nogc @property @trusted bool hle();
-
Поддерживается ли HLE (Hardware Lock Elision)?
- pure nothrow @nogc @property @trusted bool rtm();
-
Поддерживается ли RTM (Restricted Transactional Memory)?
- pure nothrow @nogc @property @trusted bool hasRdseed();
-
Поддерживается ли rdseed?
- pure nothrow @nogc @property @trusted bool hasSha();
-
Поддерживается ли SHA?
- pure nothrow @nogc @property @trusted bool amd3dnow();
-
Поддерживается ли AMD 3DNOW?
- pure nothrow @nogc @property @trusted bool amd3dnowExt();
-
Поддерживается ли AMD 3DNOW Ext?
- pure nothrow @nogc @property @trusted bool amdMmx();
-
Поддерживаются ли расширения AMD для MMX?
- pure nothrow @nogc @property @trusted bool hasFxsr();
-
Поддерживается ли fxsave/fxrstor?
- pure nothrow @nogc @property @trusted bool hasCmov();
-
Поддерживается ли cmov?
- pure nothrow @nogc @property @trusted bool hasRdtsc();
-
Поддерживается ли rdtsc?
- pure nothrow @nogc @property @trusted bool hasCmpxchg8b();
-
Поддерживается ли cmpxchg8b?
- pure nothrow @nogc @property @trusted bool hasCmpxchg16b();
-
Поддерживается ли cmpxchg16b?
- pure nothrow @nogc @property @trusted bool hasSysEnterSysExit();
-
Поддерживаются ли SYSENTER/SYSEXIT?
- pure nothrow @nogc @property @trusted bool has3dnowPrefetch();
-
Поддерживается ли 3DNow prefetch?
- pure nothrow @nogc @property @trusted bool hasLahfSahf();
-
Поддерживаются ли LAHF и SAHF в 64-битном режиме?
- pure nothrow @nogc @property @trusted bool hasPopcnt();
-
Поддерживается ли POPCNT?
- pure nothrow @nogc @property @trusted bool hasLzcnt();
-
Поддерживается ли LZCNT?
- pure nothrow @nogc @property @trusted bool isX86_64();
-
Это Intel64 или AMD 64?
- pure nothrow @nogc @property @trusted bool isItanium();
-
Это процессор IA64 (Itanium)?
- pure nothrow @nogc @property @trusted bool hyperThreading();
-
Поддерживается ли hyperthreading?
- pure nothrow @nogc @property @trusted uint threadsPerCPU();
-
Возвращает количество потоков на процессор.
- pure nothrow @nogc @property @trusted uint coresPerCPU();
-
Возвращает количество ядер в процессоре.
- pure nothrow @nogc @property @trusted bool preferAthlon();
-
Рекомендации по оптимизации для ассемблерного кода.
Для обеспечения совместимости в будущем процессор сравнивается с различными микроархитектурами. Для 32-битного x86 сравнения выполняются с семейством Intel PPro/PII/PIII/PM.
Основные 32-битные x86 микроархитектуры «династий» были:
- Intel P6 (PentiumPro, PII, PIII, PM, Core, Core2).
- AMD Athlon (K7, K8, K10).
- Intel NetBurst (Pentium 4, Pentium D).
- Последовательный Pentium (Pentium1, PMMX, Atom)
Другие ранние процессоры (Nx586, AMD K5, K6, Centaur C3, Transmeta, Cyrix, Rise) были в основном последовательными.
Некоторые новые процессоры не подходят к существующим категориям:
- Intel Atom 230/330 (семейство 6, модель 0x1C) — это последовательное ядро.
- Centaur Isiah = VIA Nano (семейство 6, модель F) — это ядро с очередью выполнения инструкций.
В рамках каждой династии методы оптимизации в основном одинаковы (например, использование пар инструкций для группы 4). Основные улучшения набора инструкций происходят в пределах каждой династии.
Этот процессор работает лучше с кодом AMD K7, чем с кодом PentiumPro..Core2? - pure nothrow @nogc @property @trusted bool preferPentium4();
-
Работает ли этот процессор лучше с кодом Pentium4, чем с кодом PentiumPro..Core2?
- pure nothrow @nogc @property @trusted bool preferPentium1();
-
Работает ли этот процессор лучше с кодом Pentium I, чем с кодом Pentium Pro?
- uint stepping;
-
Предупреждение: Это поле будет преобразовано в свойство в будущей версии.
Тип процессора (зависит от производителя). Это должно быть видно ТОЛЬКО для целей отображения.
- uint model;
-
Предупреждение: Это поле будет преобразовано в свойство в будущей версии.
Тип процессора (зависит от производителя). Это должно быть видно ТОЛЬКО для целей отображения.
- uint family;
-
Предупреждение: Это поле будет преобразовано в свойство в будущей версии.
Тип процессора (зависит от производителя). Это должно быть видно ТОЛЬКО для целей отображения.
- uint numCacheLevels;
-
Это поле устарело. Используйте
cacheLevelsвместо этого. - nothrow @nogc @property @trusted uint cacheLevels();
-
Количество уровней кэша в процессоре.
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/core_cpuid.html