【问题标题】:Adding a CUDA dll as a reference to a C# project showing an error添加 CUDA dll 作为对显示错误的 C# 项目的引用
【发布时间】:2011-09-15 04:44:48
【问题描述】:

我已经制作了一个简单的 CUDA dll,下面显示的代码。该函数将一些值添加到数组中。

#include<stdio.h>
#include<stdlib.h>
#include<cuda.h>

//Cuda Kernel
__global__ void add_gpu(float *a)
{
int idx=blockIdx.x*blockDim.x+threadIdx.x;
a[idx]=a[idx]*2;
}


int cudasafe( cudaError_t error)
{
    if(error!=cudaSuccess) 
return 1;
else
return 0;
}


 extern "C" int __declspec(dllexport) __stdcall add_gpu_cu(float *a, int size,int    nblock, int nthread)
{

float* dev_a;
int flag;
flag=cudasafe(cudaMalloc((void**)&dev_a,size*sizeof(float)));
if(flag==1)
    return flag;
flag=cudasafe(cudaMemcpy(dev_a,a,size*sizeof(float),cudaMemcpyHostToDevice));
if(flag==1)
    return flag;
add_gpu<<<10,10>>>(dev_a);
flag=cudasafe(cudaMemcpy(a,dev_a,size*sizeof(float),cudaMemcpyDeviceToHost));
if(flag==1)
    return flag;
  }

问题是我无法将创建的 dll 添加为对我的 c# 项目的引用。它抛出一个异常,说无法添加对该文件的引用。确保该文件是可访问的,并且它是一个有效的程序集或 COM 组件。

我在创建 dll 时做错了吗?

请帮忙

问候

【问题讨论】:

    标签: c# dll cuda


    【解决方案1】:

    不,DLL 是 C++ DLL,而不是 .NET DLL,因此您不能添加对它的引用。您需要使用 interop 才能在 C# 中使用它。

    为此,您需要在 DLL(或 __declspec)中包含一个 .DEF 文件以使函数可导出,然后在 C# 中按照以下行声明定义:

    [DllImport("your_dll_name")]  public static extern int add_gpu_cu(IntPtr a, int size, int nblock, int ntrheac);
    

    【讨论】:

    • 我还需要从我正在处理的项目中创建一个应用程序。那么如何添加文件以便它自动包含在内并且不会导致在另一个系统中运行任何异常?
    【解决方案2】:

    引用必须是托管 DLL,即它必须使用 MSIL 编写。您当前使用非托管库。 Here's 从 .NET 进行非托管调用的很酷的教程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多