添加CUDA dll作为显示错误的C#项目的引用

时间:2011-09-15 04:44:48

标签: c# dll cuda

我已经制作了一个简单的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;
  }

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

我在创建dll时做错了什么?

请帮忙

此致

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

不,DLL是C ++ DLL,而不是.NET DLL,因此您无法添加对它的引用。您需要使用互操作在C#中使用它。

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

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