Есть в Windows API для задания тега Write Combining для моей области памяти?

Ссылка скопирована
1 ответ

Хорошая фича Write Combining, хочется использовать не только для ускорения записей в видеопамять по PCIe.
Есть своё устройство, куда тоже нужно заливать большие потоки.
Есть старый документ https://download.intel.com/design/PentiumII/applno..., другие пока не находятся или запрещены.
Там описание регистров MTRR в современных процессорах Intel, их 8 пар, доступны из режима ядра.
Рекомендуется самому перечитать их и сделать свою запись для нужного региона на свободной позиции.
Как-то это неинтересно с точки зрения ОС, проявлять волюнтаризм.
Кто-то знает API для такой операции ? Считать уже записанное в MTRRs, подумать, официально передать свои пожелания ?..

Дополнительно:

MTRR имеет смысла настраивать ещё до инициализации транслятора адресов, то есть, грубо говоря, ещё до запуска stage1 загрузчика. Дальше уже ничего с ним не сделаешь полезного в большинстве случаев.

Имеет смысл от силы PAT поковырять, да и то, очень сомневаюсь, что в обход системных функций можно сделать что-то адекватное.

  • Где искать эти функции ?
    Почему драйвер устройства не может их вызвать уже при работе пользовательской программы, при открытии устройства ?
    Разве изменение регистров MTRR официальным путём не вступит в действие мгновенно ?
    Это же ортогонально к трансляции адресов.
    В Линукс точно на лету меняются свойства региона, см. соседнюю ветку.
    Жаль, что https://www.intel.com/content/dam/www/public/us/en... у нас не открывается.
  • Этот документ Intel, похоже, просто удалили, вчера искал его безрезультатно.
    В 253668-sdm-vol-3a.pdf с https://www.intel.com/content/www/us/en/developer/... почитал про PAT, там ещё сверху над MTRR добавлены кэш-свойства для каждой 4К-страницы памяти, потом смешивание по таблице.
    Описаны и алгоритмы горячей замены всего на лету.
    Но без ОС и API точно никуда.
    Есть он в открытом доступе, без привязки к драйверам видеоадаптеров Win ?
  • Ответы:

    Да, в Windows API существует возможность задать атрибут Write Combining для области памяти. Это можно сделать с помощью функции VirtualAlloc или VirtualAllocEx, передав флаг PAGE_WRITECOMBINE в параметре flProtect. Однако стоит отметить, что использование Write Combining может привести к снижению производительности при чтении или не последовательной записи, поэтому его следует применять осторожно и только в тех случаях, когда это действительно необходимо.

    Пример использования VirtualAlloc с флагом PAGE_WRITECOMBINE:

    void* pMemory = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE | PAGE_WRITECOMBINE);

    void* pMemory = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE | PAGE_WRITECOMBINE);

    Если вы столкнулись с ошибкой или функция возвращает NULL, убедитесь, что вы правильно указали все параметры и что ваша система поддерживает Write Combining. Также проверьте значение, возвращаемое функцией GetLastError(), чтобы получить информацию о возникшей ошибке.

    Обратите внимание, что для использования Write Combining ваш процессор должен поддерживать эту функцию, и она должна быть включена в BIOS или UEFI. Кроме того, доступ к некоторым специфическим функциям, таким как настройка регистров MTRR (Memory Type Range Registers), обычно требует привилегий уровня ядра

    Так видит этот ответ нейросеть. (с)

    • Да, по тексту видно, что работал "нечеловеческий" разум.
      В VirtualAlloc() нельзя передать мой настоящий физический адрес региона в PCIe.
      Она выделяет кусок, где захочет, это не то.
      Судя по https://learn.microsoft.com/ru-ru/windows/win32/ap..., работа будет вестись на уровне пользователя, как и для VirtualAllocEx().
      На почту пришел ещё один ответ:

      Дмитрий оставил комментарий к вопросу Есть в Windows API для задания тега Write Combining для моей области памяти?
      MTRR имеет смысла настраивать ещё до инициализации транслятора адресов, то есть, грубо говоря, ещё до запуска stage1 загрузчика. Дальше уже ничего с ним не сделаешь полезного в большинстве случаев.
      Имеет смысл от силы PAT поковырять, да и то, очень сомневаюсь, что в обход системных функций можно сделать что-то адекватное.

      А тут на сайте его нет.
      Я в драйвере вызову все функции, какие надо.
      Самоуправства только не хочется с перебором регистров.
      Ещё странно выглядит Капча, которой днём не было, когда я начинал:
      > Необходимо проверить, что вы человек
      И там мотоциклы, светофоры, жесть.

    • Виталий Федоренко, Для работы с физическими адресами в PCIe и использования Write Combining в Windows, вам может потребоваться использовать специализированные функции драйвера устройства. Это может включать в себя создание пользовательского драйвера, который будет взаимодействовать с аппаратным обеспечением на более низком уровне, чем это возможно через стандартные API Windows.

      В документации по F1 FPGA Application Note описаны опции для работы с Write Combining в контексте FPGA через PCIe, включая использование специальной утилиты wc_perf для тестирования производительности записи в регион с Write Combining.

    • Азамат, ваша нейросеть снова лукавит.
      Как-то я нагуглил https://github.com/awslabs/aws-fpga-app-notes/blob..., там под Линукс, основных исходников нет.
      Сходил по ссылке на Интел, и вообще перестало открываться.
      Драйвер -- не проблема, но нужна информация по Win.
    • Azamat Lee, а вы не думали, что автор вопроса сам в состоянии спросить нейросеть, если ему охота в галлюцинациях копаться?
    • Пока нейросети не вызывают доверия.
      Впрочем, как и большинство их создателей.
      С https://www.intel.com/content/www/us/en/developer/... скачал свежий 253668-sdm-vol-3a.pdf.
      Там есть указание:

      The operating system maintains the MTRRs after booting and sets up or changes the
      memory types for memory-mapped devices. The operating system should provide a
      driver and application programming interface (API) to access and set the MTRRs. The
      function calls MemTypeGet() and MemTypeSet() define this interface.

      Довольно сложные предлагаются эти 2 функции, особенно вторая.
      Но на лету вполне можно добавлять/изменять регистр MTRR.
      У себя в MSVS и DDK таких не нахожу.
      Но в WinDDK*incddkvideo.h вижу что-то подходящее:

      VIDEOPORT_API
      VP_STATUS
      VideoPortMapMemory(
      PVOID HwDeviceExtension,
      PHYSICAL_ADDRESS PhysicalAddress,
      PULONG Length,
      PULONG InIoSpace,
      PVOID *VirtualAddress
      );

      , где InIoSpace может быть == VIDEO_MEMORY_SPACE_P6CACHE, "Процессор объединяет последовательность операций записи, отправляет их в строку кэша, а затем очищает кэш.".
      Но "__drv_preferredFunction("VideoPortMapMemory", "Obsolete")".

    Вопрос решит функция:

    PVOID MmMapIoSpace(
    [in] PHYSICAL_ADDRESS PhysicalAddress,
    [in] SIZE_T NumberOfBytes,
    [in] MEMORY_CACHING_TYPE CacheType
    );

    Там последний параметр может быть равен MmWriteCombined и ещё много чему..

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Виктор Sys Ответ

    Да, в Windows API есть возможность задать тег Write Combining для вашей области памяти. Write Combining - это техника оптимизации производительности, которая позволяет объединять несколько записей в одну для увеличения скорости записи данных в память.

    Для установки тега Write Combining для вашей области памяти в Windows API вы можете использовать функцию VirtualAlloc с флагом PAGE_WRITECOMBINE. Этот флаг указывает операционной системе на то, что вы хотите использовать оптимизированное сочетание записи данных.

    Пример кода на языке программирования C++ для выделения памяти с тегом Write Combining:

    #include 
     
    int main() {
        void* ptr = VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE | PAGE_WRITECOMBINE);
        if (ptr == NULL) {
            // обработка ошибки
            return 1;
        }
     
        // использование памяти с тегом Write Combining
        // ...
     
        VirtualFree(ptr, 0, MEM_RELEASE);
        return 0;
    }

    #include int main() { void* ptr = VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE | PAGE_WRITECOMBINE); if (ptr == NULL) { // обработка ошибки return 1; } // использование памяти с тегом Write Combining // ... VirtualFree(ptr, 0, MEM_RELEASE); return 0; }

    Обратите внимание, что использование тега Write Combining может быть опасным и требует особой осторожности, так как это может привести к неожиданным поведениям в вашем приложении. Поэтому рекомендуется использовать эту технику только в случае крайней необходимости и после тщательного тестирования.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно