2

我在互联网上找到了 KMLib,我发现它非常有趣。但是在运行示例应用程序时会出现错误:“GASS.CUDA.CUDAException”“Error Invalid Source”。

异常发生在方法中:

protected void InitCudaModule () 
     {
         deviceNr int = 0; 
         cuda = new CUDA (deviceNr, true); 
         cuCtx = cuda.CreateContext (deviceNr, CUCtxFlags.MapHost); 
         / / cuda.SetCurrentContext (cuCtx); 

         / / var ctx = cuda.PopCurrentContext (); 
         / / var CTX2 cuda.PopCurrentContext = (); 
         / / var ctx3 cuda.PopCurrentContext = (); 

         modluePath String = Path.Combine (Environment.CurrentDirectory, cudaModuleName); 
         if (! File.Exists (modluePath)) 
             throw new ArgumentException ("Failed to access cuda module" + modluePath); 

         cuModule = cuda.LoadModule (modluePath); / / ERROR! 

         cuFunc = cuda.GetModuleFunction (cudaProductKernelName); 
     } 

我正在使用 GTX770、Visual Studio 2010 Ultimate、Cuda SDK 5.5 和 Windows 7 64 位。

什么可能导致错误?

4

1 回答 1

0

我不得不经历一些你经历过的相同问题,但我在我的 GTX 650 + CUDA 6.5 设置上得到了它。

我将描述我必须对 KMLIB 的构建/依赖项所做的更改:

  1. CUDAfy 不适用于 CUDA 6.5:我完全不确定 KMLib 如何使用 CUDAfy。除了访问 CUDA.NET API(这是一个与 CUDAfy 合并的单独项目)之外,它实际上可能不会将其用于任何事情。我必须对 CUDAfy 进行多项更改,以减少对大脑的损害,但我建议您尝试用 CUDA.NET 替换参考,看看它是否真的需要 CUDAfy。如果这对您不起作用,请告诉我,我会找到一种方法与您分享我的 CUDAfy/6.5 构建
  2. 您遇到的具体 GASS.CUDA.CUDAException 实际上记录在KMLib 的网页上,尽管有些晦涩:

      -arch=sm_21 or -arch=sm_30 – indicates compute capability, former if for Fermi
      cards(e.g Geforce 470), latter is for Kepler cards (e.g. GeForce 690), it 
      is very important to set this switch depending on yours card compute capability
    

    因此,您遇到的问题与 GFX 卡 (Fermi/Kepler/Maxwell) 的架构与构建后步骤中的 nvcc 命令行不符有关。我不知道作者指定的 sm_30 是否适用于 770 卡,但我最终使用了以下命令行,更改了计算模型、着色器模型和视觉工作室路径(因为 CUDA 6.5 usus VS 2013,就像我一样):

    nvcc -I./ KernelsEllpackCol2.cu KernelsCSR.cu KernelsEllpack.cu KernelsSlicedEllpack.cu gpuFanSmoSolver.cu gpuFOSmoSolver.cu -ccbin "%VS120COMNTOOLS%../../VC/bin" -m64  -cubin -gencode=arch=compute_30,code=sm_30  -Xptxas="-v"
    

    您将需要更改 port-build 以反映您的构建系统。

于 2014-09-08T18:48:26.017 回答