ManagedCuda:IllegalAddress; 在执行内核时

Ale*_*lex 2 c# cuda

我在C#项目中使用ManagedCuda库来利用GPU,目前我正在遵循本教程,关于如何在使用OpenCV实现它之后编写C#和C++之间兼容的代码.

我的代码似乎一切正常,内核被找到,内置并且方法调用被执行但是我收到一个错误:

An unhandled exception of type 'ManagedCuda.CudaException' occurred in ManagedCuda.dll

Additional information: ErrorIllegalAddress: While executing a kernel, the device 
encountered a load or store instruction on an invalid memory address.

The context cannot be used, so it must be destroyed (and a new one should be created).
Run Code Online (Sandbox Code Playgroud)

我知道C#抱怨在尝试将设备指针传递给内核时找不到有效地址,我在代码和引用教程中的帖子之间可以区分的唯一区别是ManagedCuda似乎最近有过一个允许用户使用Lambdas的整容,我已经做了一些阅读,但没有找到任何东西来澄清这是否是导致我的问题:

static Func<int, int, int> cudaAdd = (a, b) =>
{
    // init output parameters
    CudaDeviceVariable<int> result_dev = 0;
    int result_host = 0;
    // run CUDA method
    addWithCuda.Run(a, b, result_dev.DevicePointer);   <--- Code throws error here
    // copy return to host
    result_dev.CopyToHost(ref result_host);
    return result_host;
};
Run Code Online (Sandbox Code Playgroud)

在OP使用的原始教程代码中CudaDeviceVariable result_dev = 0;.这可能是问题吗?我不明白为什么会这样,但也许我的演员是错的?

为清楚起见,这里是被调用的内核:

__global__ void kernel(int a, int b, int *c)
{
    *c = (a + b)*(a + b);
}
Run Code Online (Sandbox Code Playgroud)

aer*_*son 6

TL; DR:异常与C#项目中的32/64位设置有关.将平台目标设置为x86,或者如果你在任何CPU上都有它,请确保选择首选32位.

在此输入图像描述 在此输入图像描述

我怎么发现:

根据https://algoslaves.wordpress.com/2013/08/25/nvidia-cuda-hello-world-in-managed-c-and-f-with-use-of-managedcuda在.NET 4.5中提供解决方案/(与OP相同)使用NuGet添加ManagedCuda 6.5 - Standalone

工作得很好

备用点A.

将.NET版本更改为4.0,使用NuGet删除并添加ManagedCuda 6.5 - Standalone:

抛出异常:附加信息:ErrorIllegalAddress:执行内核时,设备在无效的内存地址上遇到加载或存储指令.

将.NET版本切换为4.5,使用NuGet删除并添加ManagedCuda 6.5 - Standalone:

抛出异常:与上面相同.

清洁解决方案,重建解决方案,构建解决方案:

抛出异常:与上面相同.

手动删除Visual Studio生成的每个文件/文件夹:

抛出异常:与上面相同.

重新打开从A点备份的项目:

工作得很好.

在Work和Not working项目中手动删除Visual Studio生成的每个文件/文件夹.

直观地比较所有文件.

每个文件都是相同的,除了:<Prefer32Bit>false</Prefer32Bit>MangedCudaTest.csproj中没有工作版本有额外的

已删除的行<Prefer32Bit>false</Prefer32Bit>.

不工作的版本终于工作得很好.

在我的主项目中进行了相同的更改,最终工作得很好.