【问题标题】:Avoiding nvcc compilation when using Cudafy使用 Cudafy 时避免 nvcc 编译
【发布时间】:2015-04-03 10:43:07
【问题描述】:

我正在使用 Cudafy,希望我的用户能够在不安装 CUDA SDK 的情况下使用 CUDA,但他们可以使用 Cudafy DLL。为了避免在CudafyTranslator.Cudafy(types) 中自动完成 nvcc 编译,我使用了以下方法:

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);

其中typesSystem.Types 的数组。

问题出在第三行,TryDeserialize 总是返回null。我检查了文件是否存在并且modulePath 是正确的并且文件存在。有人能解释一下这个问题吗?

如果这并不意味着重新编写我的 Cudafy 模块,我已经准备好改变我的方法。

【问题讨论】:

  • 我刚刚遇到了同样的问题,但你的代码似乎对我有用!

标签: c# cudafy.net


【解决方案1】:

这是我的功能(部分基于您的代码):

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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多