Куда мне обратиться, чтобы узнать магические числа, которые должны быть предоставлены nvapi_QueryInterface?

родолжение моего предыдущего вопроса:помогите с python ctypes и nvapi

Я публикую еще один вопрос, потому что я уже выбрал ответ в своем предыдущем вопросе, и теперь вопрос изменился.

Используя python, я пытаюсь запросить nvapi.dll, чтобы получить значение использования моего GPU.

Вот как бы вы сделали это в C # (см. Ниже):http://code.google.com/p/open-hardware-monitor/source/browse/trunk/Hardware/Nvidia/NVAPI.cs

Поскольку мне нужен только небольшой набор функций, я не хочу переключаться на использование другого языка. Я думаю, что ctypes должен быть в состоянии сделать это ... Я просто не могу понять, как это сделать. Я никогда прежде не использовал Python ctypes.

Чтобы запросить использование gpu, мне сначала нужно вызвать функцию NvAPI_Initialize. Также необходимо использовать интерфейс запроса для ссылки на функцию:

from ctypes import *
nvapi = WinDLL("nvapi.dll")
nvapi_QueryInterface = nvapi.nvapi_QueryInterface

Используя приведенный выше код, у меня есть доступ к nvapi_QueryInterface, но я не могу понять, как повторить эту часть:

private static void GetDelegate<T>(uint id, out T newDelegate)
  where T : class
{
    IntPtr ptr = nvapi_QueryInterface(id);
    if (ptr != IntPtr.Zero)
    {
        newDelegate =
          Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) as T;
    }
    else
    {
        newDelegate = null;
    }
}

для ссылки на функции инициализации и использования:

GetDelegate(0x0150E828, out NvAPI_Initialize);
GetDelegate(0x189A1FDF, out NvAPI_GPU_GetUsages);

Мое понимание этого может все еще быть неправильным, но я потратил много времени, пытаясь понять это, поэтому я надеюсь, что кто-то может помочь подтолкнуть меня в правильном направлении, потому что я немного растерялся относительно того, как действовать дальше.

Может ли кто-нибудь помочь мне понять, как я могу заставить эту небольшую часть кода работать непосредственно в Python? Мне просто нужно иметь возможность вызвать функцию NvAPI_GPU_GetUsages в конце дня.

Благодарю.

Ответы на вопрос(1)

Решение Вопроса

мне сначала нужно вызвать функцию NvAPI_Initialize.

На самом деле задействованы две функции инициализации: одна из статической библиотеки nvapi.lib, которая пытается динамически загрузить nvapi.dll, находит некоторые функции и вызывает вторую функцию инициализации из библиотеки динамической компоновки. Шаги, связанные с вызовом NvApi_Initialize изстатический Библиотека примерно такова:

Проверьте, если nvapi.dll уже загружен, если нет, загрузите его

Используйте GetProcAddress, чтобы получить указатель наnvapi_QueryInterface из DLL Используйте только что полученную функцию для запроса интерфейса с Id0x150E828, Это будет вторая функция инициализации из динамической библиотеки

Вызовите полученную функцию инициализации. Если функция была успешной (указывается возвращаемым значением 0), получить два новых указателя на функцию черезnvapi_QueryInterface, используя идентификаторы0x33C7358C (давайте назовем это ENTER) и0x593E8644 (ВЫХОД).

Итак, если вы хотите остаться чистым Python, вам, в основном, нужно повторить эти шаги, используя ctypes, что было бы довольно просто. После того, как вы закончите, в nvapi.dll есть функция очистки, которую вы можете запросить, используя идентификатор0xD22BDD7E, Если вы закончили использовать библиотеку, не забудьте вызвать эту функцию.

Теперь перейдем к реальной проблеме: к сожалению, нет функцииNvAPI_GPU_GetUsages в декабре 2010 года NVIDIA SDK. Однако естьNvAPI_GPU_GetDynamicPstatesInfoEx который позволит вам запросить массив структур типаNV_GPU_DYNAMIC_PSTATES_INFO_EX заполняется, что, в свою очередь, будет содержать коэффициент использования в процентах от времени в течение последней секунды для данного домена (т. е. графический процессор, буфер кадров и механизм обработки видео).

По сути, если вы хотите получить информацию об использовании графического процессора, вы передаетеNV_GPU_DYNAMIC_PSTATES_INFO_EX структура для Python (см.Структуры и союзы в документации по ctypes), создайте массив по крайней мере из 3 структур и передайте этот массивNvAPI_GPU_GetDynamicPstatesInfoEx функция, которую вы должны сначала запросить из библиотеки динамических ссылок, используя идентификатор0x60DED2ED.

Это, кстати, когда две функции вступают в игру, которые вы запрашиваете во время инициализации - это своего рода механизм блокировки. Хотя это и не является строго необходимым (то есть вы можете не указывать это во время вызова), вам рекомендуется вызывать их, т.е.

Enter()
NvAPI_GPU_GetDynamicPstatesInfoEx(array_of_structs)
Exit()

Предполагается, что вы сможете определить, в какой позиции массива хранится информация об использовании графического процессора, посмотрев макрос (или константу) NVAPI_GPU_UTILIZATION_DOMAIN_GPU, к сожалению, в заголовочных файлах для SDK, похоже, нет объявления. Тем не менее, вы можете легко это проверить, сравнив результаты вашего кода с системным инструментом NVIDIA, который отображает информацию об использовании графического процессора.

Надеюсь, это поможет.

 George16 дек. 2015 г., 22:18
Куда мне обратиться, чтобы узнать магические числа, которые должны быть предоставлены nvapi_QueryInterface?
 user31986229 мая 2011 г., 17:34
Спасибо за помощь. У меня были проблемы с этим, потому что я предполагал, что должен использовать ctypes WinDLL, но оказывается, что вы должны использовать CDLL. Как только я использовал CDLL, я начал получать значимые результаты обратно из QueryInterface.

Ваш ответ на вопрос