2013-04-07 6 views
0

Я написал простое приложение, которое проверяет наличие NVIDIA CUDA на компьютере. Он просто отображает true, если найдено устройство с поддержкой CUDA.Программа для проверки присутствия CUDA CUDA?

Я отправляю приложение на второй компьютер, и приложение не запускалось - появилось диалоговое окно, что cudart.dll не найден. Я хочу, чтобы проверить, если CUDA присутствует и требует CUDA, чтобы сделать это :)

Я использую CUDA 5.0, VS2012, VC++ 11, Windows 7.

Могу ли я скомпилировать приложение таким образом, , что все библиотеки CUDA находятся внутри исполняемого файла?


Так сценарий:

  1. Мое приложение компилируется & посылается на компьютер
  2. Компьютер может:
    1. работать под управлением Windows, Linux (мое приложение совместимо с система)
    2. есть gpu или нет
    3. есть n VIDIA GPU или нет
    4. установили CUDA или не
  3. Мое приложение должно вернуть true только если 2,3 и 2,4 положительны (GPU с CUDA)
+0

Это было бы статической связью. Почему бы не связать их динамически? Кроме того, вы можете проверить наличие cudart.dll, прежде чем ссылаться на него. – Dai

+0

Я хочу иметь один исполняемый файл (или одну DLL, которая является плагином для некоторой структуры). Я не хочу отправлять 2 файла. Исправьте меня, если я ошибаюсь, но недостаток cudart.dll не означает, что CUDA-GPU не присутствует. У графических драйверов NVIDIA (для обычных пользователей) есть CUDA libs? – Xlaudius

+0

Я в замешательстве - хотите ли вы обеспечить (или проверить) наличие библиотеки времени исполнения CUDA или доступность аппаратного обеспечения с поддержкой CUDA или обоих? (Насколько я знаю, последнее зависит от первого). – Dai

ответ

0

Я думаю, что, используя только программное обеспечение, есть нет надежного способа гарантировать, что GPU способен работать с Cuda или нет, особенно если мы считаем, что Cuda - это технология на основе драйверов, а для ОС Cuda не существует, если драйвер говорит, что Cuda не существует.

Я думаю, что лучший способ сделать это - это старый способ, подумайте об этом simple web page, и вы получите гораздо более надежный ответ.

+0

Конечно, есть. См. Мой ответ. – talonmies

+0

@talonmies, и если пользователь использует неправильный драйвер ... вы никогда не узнаете :) Никогда не предполагайте, что пользователь знает, что он делает или как его собственный компьютер должен быть настроен, никогда. – user2244984

+1

Конечно, вы узнаете. * Если * присутствует библиотека API среды выполнения, но нет никакого оборудования или несоответствия драйвера, она вернет ошибку, сообщающую вам, что не так. Если библиотеки драйверов там нет, драйвера нет. Загрузка пользовательской библиотеки может быть использована для явной проверки всех этих возможностей. Я знаю, потому что я сделал это в саморазвертывании приложений CUDA для кластеров HPC, где вы заранее не знаете, какое состояние является узлом в кластере, прежде чем ваше приложение будет сброшено на узел. – talonmies

-1

Используйте cudaGetDeviceCount(), чтобы узнать, совместим ли компьютер с CUDA.

According to this thread, вы не можете статически связывать cudart.dll.

Есть временные решения: встройте среду выполнения CUDA в качестве ресурса в исполняемый файл, затем извлеките его, когда ваша программа запустится, а затем динамически связать.

Вы также можете использовать nvidia-smi, чтобы узнать, установлен ли CUDA на машине.

+0

, чтобы использовать 'cudaSomeFunction'. Я должен быть уверен, что' cudart.dll' (или еще - сбой приложений) присутствует. И как это сделать? – Xlaudius

0

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

затем попробуйте загрузить плагин и запустить его.

  • , если плагин не загружается, то вам не установлены CUDA-библиотеки, так что вы можете предположить, False

  • если плагин успешно загружается, то вы установили CUDA-ЛИЭС и может выполнить проверку, поддерживает ли аппаратное обеспечение CUDA.

4

В качестве комментария к открытию, я думаю, что порядок и количество шагов в вашем редактировании неверны. Оно должно быть:

  1. программа запускается и пытается загрузить библиотеку времени выполнения API
  2. Если библиотека времени выполнения присутствует, попытка использовать его для перечисления устройств.

Если шаг 1 не удался, у вас нет необходимой поддержки во время выполнения, и CUDA не может использоваться. Если 2 не удается, в системе нет совместимого драйвера и графического процессора, и CUDA не может использоваться. Если они оба пройдут, вам хорошо идти.

В шаге 1 вы хотите использовать что-то вроде dlopen в Linux и обрабатывать статус возврата. В Windows вы, вероятно, захотите использовать DLL delay loading mechanism (Извините, а не программист Windows, не могу сказать вам больше).

В обоих случаях, если библиотека загружается, затем выберите адрес cudaGetDeviceCount с помощью соответствующего API-интерфейса хоста и вызовите его. Это говорит о наличии совместимых графических процессоров, которые могут быть перечислены. То, что вы делаете после того, как обнаружите, по-видимому, полезный графический процессор, зависит от вас. Я бы проверял статус вычисления и пытался установить контекст на нем. Это обеспечит наличие полнофункциональной комбинации времени исполнения/драйвера и все будет работать.

+0

ОК, так эффективно сначала попробуйте загрузить сам себя как проверку работоспособности и только потом вызовите функции CUDA, которые сами вызывают/открывают библиотеку? Правильно ли я вас понимаю? – Xlaudius

+0

Почти. Вы загружаете библиотеку самостоятельно, затем вам нужно получить нужные функции из библиотеки самостоятельно, затем настроить вызовы и выполнить их. Есть примеры того, как это сделать в ссылках, которые я дал вам в своем ответе. – talonmies

+0

Так что, если мне нужно 'cudaMalloc', я должен сам его достать? И получить все 20 других функций, которые мне нужны? – Xlaudius

0

Ссылка на другое сообщение в stackoverflow: detecting-nvidia-gpus-without-cuda Это показывает всю последовательность, чтобы проверить, доступен ли доступный и доступный cuda api.

0

В конце andditional ответ:

Я борюсь с той же проблемой (обнаруживая установки Cuda без его использования) и мое решение до сих пор

  • обеспечение LoadLibraryA("nvcuda.dll") != nullptr (говорит вам, в значительной степени, только если есть карта NVIDIA установлен, хотя)
  • проверка переменной окружения CUDA_PATH (или в моем случае, CUDA_PATH_V8_0), так что, как представляется, устанавливается путем установки Cuda: const char * szCuda8Path = std::getenv("CUDA_PATH_V8_0"); (должен быть = nullptr)
Смежные вопросы