2015-04-03 4 views
0

Я использую Cudafy и хочу, чтобы мои пользователи могли использовать CUDA без установки CUDA SDK, но они могут использовать Cudafy DLL. Чтобы избежать NVCC компиляции происходит автоматически в CudafyTranslator.Cudafy(types), я использую следующий подход:Избегание компиляции nvcc при использовании Cudafy

string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
string modulePath = Path.Combine(directory, myType.Name + ".cdfy"); 
CudafyModule km = CudafyModule.TryDeserialize(modulePath); 
if (ReferenceEquals(km, null) || !km.TryVerifyChecksums()) 
{ 
    km = CudafyTranslator.Cudafy(types); 
    km.Serialize(modulePath); 
} 
GPU.LoadModule(km); 

types Где это массив System.Type с.

Проблема в третьей строке, TryDeserialize всегда возвращает null. Я проверил, что файл существует, и modulePath верен, и файл существует. Может кто-то пролить свет на этот вопрос?

Я готов изменить свой подход, если это не означает перезапись моих модулей Cudafy.

+0

Я просто запустить в ту же проблему, но ваш код кажется работать на меня! – Val

ответ

0

Это моя функция (которая частично основана на коде кстати):

public static void LoadTypeModule(GPGPU gpu, Type typeToCudafy) 
{ 
    Console.WriteLine("Loading module "+typeToCudafy.Name); 

    string appFolder = AppDomain.CurrentDomain.BaseDirectory; 
    string typeModulePath = Path.Combine(appFolder, typeToCudafy.Name + ".cdfy"); 

    CudafyModule cudaModule = CudafyModule.TryDeserialize(typeModulePath); 
    if (cudaModule == null || !cudaModule.TryVerifyChecksums()) 
    { 
     // if failed to open module: 
     // translate the type's code to cuda code 
     cudaModule = CudafyTranslator.Cudafy(typeToCudafy); 
     cudaModule.Serialize(); // save to file 
    } 
    // load module to cuda memory, don't unload previous modules 
    gpu.LoadModule(cudaModule, false); 
} 

Теперь вызов функции:

MyClassWithCudaKernels classModule = new MyClassWithCudaKernels(); 
LoadTypeModule(gpu, classModule.GetType());