2015-10-01 5 views
0

У меня есть существующее приложение WinForms на платформе .NET 4.0 CP, и я хочу, чтобы он выполнял вычисления на устройствах CUDA. Для этого я решил использовать обертку CUDAfy.NET в C/C++ Toolkit, потому что она (насколько мне известно) является единственной обновленной версией CUDA SDK. Разработка идет без каких-либо серьезных проблем на моей машине, но я столкнулся с проблемами при развертывании на другое устройство.Не удается запустить приложение CUDAfy.NET на целевом устройстве

Более конкретно, когда я создаю проект в VS, а затем запускаю его на своей машине, он работает нормально. Но странно, что он запускает nvcc.exe при инициализации модулей CUDAfy, которые являются частью CUDA SDK, и там не требуется. И когда я пытаюсь запустить двоичный файл на любом целевом компьютере, это генерирует это исключение:

Невозможно найти компилятор cl.exe в пути.

Это ошибка, связанная с отсутствием VS-инструмента для компилятора C++, и не возникает на целевых устройствах. И теперь самое странное; когда я создаю образец проекта, который поставляется с CUDAfy.NET и пытается запустить его на целевом устройстве, он генерирует одно и то же исключение.

Нет ничего плохого в целевой машине, в соответствии с приложением тестирования CUDAfy.NET Cudafy Viewer совместим и обладает возможностями CUDA. Кроме того, я тестировал его на нескольких разных устройствах, всегда с тем же результатом. Я проследил происхождение, за исключением и, как я указала, что она брошена при инициализации CUDAfy.NET:

CudafyModule module = CudafyTranslator.Cudafy(); 
GPGPU _gpu = CudafyHost.GetDevice(eGPUType.Cuda); 
_gpu.LoadModule(module); 

По CUDAfy.NET User Manual он должен работать идеально на устройствах, которые отвечают этим требованиям:

  • Windows 64-разрядные
  • .NET 4.0
  • NVIDIA GPU с возможностью вычислительного 2.0 или выше
  • до версии драйверов NVIDIA
  • CURAND, CUSPARSE, CUFFT и CUBLAS DLLs При использовании этих математических библиотек
  • модулей
  • Скомпилированной CUDAfy

Все они удовлетворены, но он по-прежнему не работает. Это оставляет меня с проблемой на моей стороне, и я довольно застрял там.

Одна из возможностей заключается в том, что она вызвана неправильной компиляцией кода, который предназначен для cudafied. Согласно руководству, и я цитирую: «Как правило, вы не cudafy ваш код .NET в ситуации развертывания , так как для этого требуется полный CUDA SDK и Visual Studio. Модули CUDAfy могут быть свободными в .cdfy-файлах или внедрены в ваше приложение сборку (.exe или .dll) с помощью инструмента командной строки cudaycl. ". Это должно быть сделано автоматически, тем не менее я пытался использовать cudaycl, ufortunatelly без каких-либо улучшений. Но поскольку исключение возникает при инициализации CUDAfy, я думаю, что источник проблемы находится в другом месте.

Что еще может быть причиной того, что я создаю двоичный файл для конкретной архитектуры (например, CUDA 2.0), а затем развертывая его на другом (например, CUDA 3.0). Что-то об этом упоминается в разделе CUDA Toolkit Documentation в разделе о компиляторе nvcc: «Двоичный код имеет характерную архитектуру.Кубинский объект генерируется с использованием параметра-компилятора - кода, который указывает целевую архитектуру: например, компиляция с -code = sm_35 выдает двоичный код для устройств с возможностью вычисления 3.5. «.

Так или иначе, я могу Я буду признателен за любую помощь и предложения, которые у вас есть. Кстати, я использую последние CUDAfy.NET v1.29 и CUDA Toolkit 7.0 (последние еще не поддерживаются CUDAfy.NET).

+0

От внешнего вида 'CudafyTranslator.Cudafy()' по умолчанию требуется рабочая инструментальная цепочка. Вероятно, вам нужно найти способ инициализации пустого модуля, который не вызывает их систему компиляции JIT. Есть ли прямая оболочка API-интерфейса драйвера в CUDAfy.NET? – talonmies

+0

@talonmies Я не знаю ни одной прямой оболочки API-интерфейса драйвера, я не думаю, что в CUDAfy есть один. Но это нужно как-то решить, они упоминают запуск своих cudafied .NET-программ на целевых машинах. – SysGen

+0

также, это дубликат http://stackoverflow.com/questions/29430655/avoiding-nvcc-compilation-when-using-cudafy – Val

ответ

0

в CUDAfy_User_Manual_1_22.pdf есть глава посвящена конкретно к этому. это «Модули 5.2 Кэширование для повышения производительности».

public class ArrayBasicIndexing 
{ 
    CudafyModule km = CudafyModule.TryDeserialize(); 
    if (km == null || !km.TryVerifyChecksums()) 
    { 
    km = CudafyTranslator.Cudafy(); 
    km.Serialize(); 

Код проверяет, есть ли уже скомпилированный модуль CUDAfy и будет компилировать новый ТОЛЬКО, если нет существующего модуля (или он устарел). Таким образом, ваше приложение будет генерировать модули на вашем компьютере-разработчике, а затем вы можете распространять приложение с помощью модулей на другие машины. Эти клиентские машины больше не будут пытаться генерировать новые модули, потому что приложение не изменилось.

Если вы изменили приложение, вам придется его запустить (чтобы он мог повторно сгенерировать модули), а затем перераспределить модули с новой версией приложения.