OpenACC - Как узнать, занято ли устройство некоторыми операциями CUDA?

У меня есть код на основе CUDA, и я хочу включить OpenACC в некоторые части кода. Но функция, которую я пытаюсь распараллелить с помощью кода OpenACC, иногда управляется вызовами CUDA, а иногда - нет.

Мой вопрос в том, как я могу запросить библиотеку OpenACC, чтобы узнать, занято ли устройство или нет. Есть ли для этого какие-либо вызовы API?

Примечание. Я не совсем знаком с CUDA, поэтому использую просто псевдокод.

Иногда целевая функция seq_function вызывается на хосте, когда устройство занято вычислениями, как показано ниже. Но иногда он вызывается, когда устройство не занято.

cudaMemAlloc(...);
cudaLaunchAsync(...);
...
//This is the function I am trying to parallelize with OpenACC
seq_function(...); 
...
cudaWait(...);
cudaDealloc(...);

Итак, я хочу сделать мою целевую функцию гибкой:

  • если устройство занято или выполняется вычисление на основе CUDA => использовать хост.
  • если устройство не занято => использовать графический процессор с помощью кода с поддержкой OpenACC.

Есть ли способ узнать, занято устройство или нет?


person Millad    schedule 15.07.2016    source источник


Ответы (1)


Я не знаю способа программно получить коэффициент использования устройства. Вы можете узнать об использовании памяти через

person Mat Colgrove    schedule 15.07.2016
comment
Спасибо, Мэт. Хотя это специфичный для CUDA и NVidia метод, а не общий метод, как обещает OpenACC, похоже, что это единственный способ узнать. - person Millad; 16.07.2016
comment
PGI предлагает расширения для OpenACC API, acc_get_memory и acc_get_free_memory, которые, по сути, делают то же самое, что и cudaMemGetInfo. Я предложил cudaMemGetInfo только с учетом того, что вы использовали CUDA в другом месте своего кода. - person Mat Colgrove; 18.07.2016
comment
Я использую OpenACC с присутствием CUDA (при этом также используется CUDA). Я хочу добавить функцию в ранее написанный код на основе CUDA. Таким образом, наличие этого расширения очень помогает и делает мой код независимым. - person Millad; 19.07.2016
comment
Но дело в том, что значение, возвращаемое как бесплатное, отличается от общего значения в начале (как описано в здесь тоже. Следовательно, это невозможно сделать, если мы не запишем свободную (доступную) память с самого начала и не сравним с ней текущую свободную память. - person Millad; 19.07.2016
comment
Если вы хотите использовать концепции, характерные для ускорителей NVIDIA, API NVML позволяет напрямую запрашивать данные об использовании устройства. Большую часть того, что вы можете получить с помощью nvidia-smi -a, можно получить через NVML, библиотеку, лежащую в основе комплекта развертывания графического процессора < / а>. Например nvmlDeviceGetUtilizationRates() - person Robert Crovella; 21.07.2016