Win32 размер строки кэш-памяти

Тема в разделе "WASM.BEGINNERS", создана пользователем Aoizora, 15 янв 2018.

  1. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    362
    Как в win32 можно получить размер строки кэш-памяти первого уровня?
     
  2. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    cpuid не канает ?
     
  3. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    362
    Разбираюсь. Как сохранить результаты выполнения команды по указателям?

    Код (C):
    1. void cpuinfo(int code, int *_eax, int *_ebx, int *_ecx, int *_edx)
    2. {
    3.     __asm
    4.     {
    5.         mov eax, code
    6.         cpuid
    7.         mov [_eax], eax
    8.         mov [_ebx], ebx
    9.         mov [_ecx], ecx
    10.         mov [_edx], edx
    11.     }
    12. }
     
  4. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    362
    Хм хм, вроде, разобрался.

    Код (C):
    1. void cpuinfo(int code, int *_eax, int *_ebx, int *_ecx, int *_edx)
    2. {
    3.     __asm
    4.     {
    5.         mov eax, code
    6.         cpuid
    7.         mov esi, _eax;
    8.         mov [esi], eax
    9.         mov [_ebx], ebx
    10.         mov [_ecx], ecx
    11.         mov [_edx], edx
    12.     }
    13. }
     
  5. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    362
    Почему код 0x80000005 на моем компьютере может возвращать четыре нуля в регистрах? Этот код должен возвращать размер L1 кэша данных в первых восьми битах регистра ECX.

    Код (C):
    1. void cpuinfo(int code, int *_eax, int *_ebx, int *_ecx, int *_edx)
    2. {
    3.     __asm
    4.     {
    5.         mov eax, code
    6.         cpuid
    7.  
    8.         mov esi, _eax
    9.         mov [esi], eax
    10.  
    11.         mov esi, _ebx
    12.         mov[esi], ebx
    13.  
    14.         mov esi, _ecx
    15.         mov [esi], ecx
    16.  
    17.         mov esi, _edx
    18.         mov [esi], edx
    19.     }
    20. }
    21.  
    22. const int MASK_LSB_8 = 0xFF;
    23.  
    24. int get_cache_line_size()
    25. {
    26.     int eax = 0, ebx = 0, ecx = 0, edx = 0;
    27.     cpuinfo(0x80000005, &eax, &ebx, &ecx, &edx);
    28.     return ecx & MASK_LSB_8;
    29. }
    30.  
    31. int main()
    32. {
    33.     std::cout << get_cache_line_size() << std::endl;
    34.  
    35.     return 0;
    36. }
     
  6. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Aoizora,
    так какой у вас процессор? если Интел, то 0x80000005 там не работает.
     
  8. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    362
    У меня Интел.
     
  9. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Он такой, он может :rofl:
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Aoizora,
    Тогда считаю надо перестать копипастить и взять в руки мануалы интела.
     
  11. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Потому что сначала надо убедиться, поддерживается эта функция или нет, а потом уже вызывать её.

    Ну и такой вот код очень подозрителен в плане качества:
    Код (Text):
    1.  
    2.     __asm
    3.     {
    4.         mov eax, code
    5.         cpuid
    6.         mov esi, _eax
    7.         mov [esi], eax
    8.         mov esi, _ebx
    9.         mov[esi], ebx
    10.         mov esi, _ecx
    11.         mov [esi], ecx
    12.         mov esi, _edx
    13.         mov [esi], edx
    14.     }
    15.  
    А вы уверены, что у вас параметры, например, не в регистрах передаются? Потому что если в регистрах - всё это будет прекрасно попорчено командой cpuid.
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    SadKo, Да, не, там все просто - у интела нет такой функции. Это АМД-ная.
     
  13. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    362
    http://www.flounder.com/cpuid_explorer2.htm#CPUID(2)

    Правильно понимаю, что информация о дата кэше первого уровня для интел получается с аргументом 2 и находится с 24 по 31 бит?
     
  14. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
  15. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Aoizora,
    Код (C):
    1. int GetCacheSize(int cache_level)
    2. {
    3.     // Intel stores it's cache information in eax, with ecx as index
    4.     // The information received is as following:
    5.     // ebx[31:22] = Ways of associativity
    6.     // ebx[21:12] = Physical line partitions
    7.     // ebx[11: 0] = Line size
    8.     int cpuInfo[4];
    9.     __cpuidex(cpu_info, 4, cache_level); // Index 0 is L1 data cache
    10.     int ways = cpu_info[1] & 0xffc00000; // This receives bit 22 to 31 from the ebx register
    11.     ways >>= 22; // Bitshift it 22 bits to get the real value, since we started reading from bit 22
    12.     int partitions = cpu_info[1] & 0x3ff800; // This receives bit 12 to 21
    13.     partitions >>= 12; // Same here, bitshift 12 bits
    14.     int line_size = cpu_info[1] & 0x7ff; // This receives bit 0 to 11
    15.     int sets = cpu_info[2]; // The sets are the value of the ecx register
    16.     // All of these values needs one appended to them to get the real value
    17.     return (ways + 1) * (partitions + 1) * (line_size + 1) * (sets + 1); // Calculate the cache size by multiplying the values
    18. }
    для тех кто в танке :)
    Пользуйтесь