Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кэш прочессора 
:(
    Опции темы
Who_i_am
Дата 22.2.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.2.2007

Репутация: нет
Всего: нет



Как в delphi фозможно узнать Кэши 1 и 2 уровней процессоров Intel.
PM MAIL   Вверх
Who_i_am
Дата 22.2.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.2.2007

Репутация: нет
Всего: нет



Объём памяти L1I, L1D, L2 cache

PM MAIL   Вверх
W4FhLF
Дата 22.2.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Читай про машинную команду CPUID, частично она позволяет это сделать. Это самый простой способ. Ещё можно через системные порты, но тебе придётся освоить программирование драйверов, что на делфи довольно проблематичноsmile

Это сообщение отредактировал(а) W4FhLF - 22.2.2007, 22:52


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
bel_nikita
Дата 22.2.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



Вот, пример. Можно "перевести" на Делфи:
Код

  /*
   *    PROCESSOR_REGISTERS
   */
  typedef struct _ProcessorRegisters {
    DWORD EAX;
    DWORD EBX;
    DWORD ECX;
    DWORD EDX;
  } PROCESSOR_REGISTERS;

  /*
   *    CPU_CACHE_STRUCT
   */
  typedef struct _stL1Cache {
    DWORD Size;
    DWORD Associativity;
    DWORD LineSize;
  } CPU_CACHE_STRUCT;

  /*
   *    CPU_L1_CACHE
   */
  typedef struct _L1Cache {
    CPU_CACHE_STRUCT Data;
    CPU_CACHE_STRUCT Instruction;
  } CPU_L1_CACHE;

  /*
   *    CPU_CACHE
   */
  typedef struct _Cache {
    CPU_L1_CACHE      L1;
    CPU_CACHE_STRUCT  L2;
    CPU_CACHE_STRUCT  L3;
  } CPU_CACHE;

void cCPUDetect::GetAmdCache(CPU_CACHE& Cahe)
{
  PROCESSOR_REGISTERS Registers;
  _asm
  {
    mov          eax,0x80000005    
    CPU_ID
    mov     Registers.EAX,  eax
    mov     Registers.EBX,  ebx
    mov     Registers.ECX,  ecx
    mov     Registers.EDX,  edx
  }
  Cahe.L1.Data.LineSize             =   Registers.ECX & 0x000000FF;
  Cahe.L1.Data.Associativity        = ( Registers.ECX & 0x00FF0000 ) >> 16;
  Cahe.L1.Data.Size                 = ( Registers.ECX & 0xFF000000 ) >> 24;
  if ( Cahe.L1.Data.Associativity == 6 ) Cahe.L1.Data.Associativity=8;
  if ( Cahe.L1.Data.Associativity == 8 ) Cahe.L1.Data.Associativity=16;
  Cahe.L1.Instruction.LineSize      =   Registers.EDX & 0x000000FF;
  Cahe.L1.Instruction.Associativity = ( Registers.EDX & 0x00FF0000 ) >> 16;
  Cahe.L1.Instruction.Size          = ( Registers.EDX & 0xFF000000 ) >> 24;
  if ( Cahe.L1.Instruction.Associativity == 6 ) Cahe.L1.Instruction.Associativity=8;
  if ( Cahe.L1.Instruction.Associativity == 8 ) Cahe.L1.Instruction.Associativity=16;
  _asm
  {
    mov          eax,0x80000006    
    CPU_ID
    mov     Registers.EAX,  eax
    mov     Registers.EBX,  ebx
    mov     Registers.ECX,  ecx
    mov     Registers.EDX,  edx
  }
  Cahe.L2.LineSize      =   Registers.ECX & 0x000000FF;
  Cahe.L2.Associativity = ( Registers.ECX & 0x0000FF00 ) >> 12;
  Cahe.L2.Size          = ( Registers.ECX & 0xFFFF0000 ) >> 16;
  if (Cahe.L2.Associativity==6) Cahe.L2.Associativity=8;
  if (Cahe.L2.Associativity==8) Cahe.L2.Associativity=16;
}

void cCPUDetect::GetIntelCache(CPU_CACHE& Cahe)
{
  PROCESSOR_REGISTERS Registers;
  memset(&Cahe,0,sizeof(Cahe));
  _asm
  {
    mov          eax,0x00000002    
    CPU_ID
    mov     Registers.EAX,  eax
    mov     Registers.EBX,  ebx
    mov     Registers.ECX,  ecx
    mov     Registers.EDX,  edx
  }
  BYTE*  part   = (BYTE*)&Registers;
  size_t  count = 0;
  while (count<16) {
    ++count;
    switch( *(part+count) ) {
    case 0x06:
      Cahe.L1.Instruction.Size          = 8;
      Cahe.L1.Instruction.Associativity = 4;
      Cahe.L1.Instruction.LineSize      = 32;
     break;
    case 0x08:
      Cahe.L1.Instruction.Size          = 16;
      Cahe.L1.Instruction.Associativity = 4;
      Cahe.L1.Instruction.LineSize      = 32;
     break;
    case 0x0A:
      Cahe.L1.Data.Size                 = 8;
      Cahe.L1.Data.Associativity        = 2;
      Cahe.L1.Data.LineSize             = 32;
     break;
    case 0x0C:
      Cahe.L1.Data.Size                 = 16;
      Cahe.L1.Data.Associativity        = 4;
      Cahe.L1.Data.LineSize             = 32;
     break;
    case 0x22:
      Cahe.L3.Size                      = 512;
      Cahe.L3.Associativity             = 4;
      Cahe.L3.LineSize                  = 64;
     break;
    case 0x23:
      Cahe.L3.Size                      = 1024;
      Cahe.L3.Associativity             = 8;
      Cahe.L3.LineSize                  = 64;
     break;
    case 0x25:
      Cahe.L3.Size                      = 2*1024;
      Cahe.L3.Associativity             = 8;
      Cahe.L3.LineSize                  = 64;
     break;
    case 0x29:
      Cahe.L3.Size                      = 4*1024;
      Cahe.L3.Associativity             = 8;
      Cahe.L3.LineSize                  = 64;
     break;
    case 0x2C:
      Cahe.L1.Data.Size                 = 32;
      Cahe.L1.Data.Associativity        = 8;
      Cahe.L1.Data.LineSize             = 64;
     break;
    case 0x30:
      Cahe.L1.Instruction.Size          = 32;
      Cahe.L1.Instruction.Associativity = 8;
      Cahe.L1.Instruction.LineSize      = 64;
     break;
    case 0x39:
      Cahe.L2.Size                      = 128;
      Cahe.L2.Associativity             = 4;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x3B:
      Cahe.L2.Size                      = 128;
      Cahe.L2.Associativity             = 2;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x3C:
      Cahe.L2.Size                      = 256;
      Cahe.L2.Associativity             = 4;
      Cahe.L2.LineSize                  = 64;
     break;
    /*case 0x40:
      break;*/
    case 0x41:
      Cahe.L2.Size                      = 128;
      Cahe.L2.Associativity             = 4;
      Cahe.L2.LineSize                  = 32;
     break;
    case 0x42:
      Cahe.L2.Size                      = 256;
      Cahe.L2.Associativity             = 4;
      Cahe.L2.LineSize                  = 32;
     break;
    case 0x43:
      Cahe.L2.Size                      = 512;
      Cahe.L2.Associativity             = 4;
      Cahe.L2.LineSize                  = 32;
     break;
    case 0x44:
      Cahe.L2.Size                      = 1024;
      Cahe.L2.Associativity             = 4;
      Cahe.L2.LineSize                  = 32;
     break;
    case 0x60:
      Cahe.L1.Data.Size                 = 16;
      Cahe.L1.Data.Associativity        = 8;
      Cahe.L1.Data.LineSize             = 64;
     break;
    case 0x66:
      Cahe.L1.Data.Size                 = 8;
      Cahe.L1.Data.Associativity        = 4;
      Cahe.L1.Data.LineSize             = 64;
     break;
    case 0x67:
      Cahe.L1.Data.Size                 = 16;
      Cahe.L1.Data.Associativity        = 4;
      Cahe.L1.Data.LineSize             = 64;
     break;
    case 0x68:
      Cahe.L1.Data.Size                 = 32;
      Cahe.L1.Data.Associativity        = 4;
      Cahe.L1.Data.LineSize             = 64;
     break;
    case 0x78:
      Cahe.L2.Size                      = 1024;
      Cahe.L2.Associativity             = 4;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x79:
      Cahe.L2.Size                      = 128;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x7A:
      Cahe.L2.Size                      = 256;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x7B:
      Cahe.L2.Size                      = 512;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x7C:
      Cahe.L2.Size                      = 1024;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x7D:
      Cahe.L2.Size                      = 2*1024;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x7F:
      Cahe.L2.Size                      = 512;
      Cahe.L2.Associativity             = 2;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x82:
      Cahe.L2.Size                      = 256;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 32;
     break;
    case 0x83:
      Cahe.L2.Size                      = 512;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 32;
     break;
    case 0x84:
      Cahe.L2.Size                      = 1024;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 32;
     break;
    case 0x85:
      Cahe.L2.Size                      = 2*1024;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 32;
     break;
    case 0x86:
      Cahe.L2.Size                      = 512;
      Cahe.L2.Associativity             = 4;
      Cahe.L2.LineSize                  = 64;
     break;
    case 0x87:
      Cahe.L2.Size                      = 1024;
      Cahe.L2.Associativity             = 8;
      Cahe.L2.LineSize                  = 64;
     break;
    default:
      break;
    }
  }
}



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Who_i_am
Дата 22.2.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.2.2007

Репутация: нет
Всего: нет



Спасибо попробую перевести!!!
Но не факт что получится smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.