我正在尝试使用ALEA库将递归算法从CPU转换为GPU。如果生成代码,则会出现以下错误:

“ Fody / Alea.CUDA:AOTCompileServer意外退出,退出代码为-1073741571”

public class GPUModule : ILGPUModule
{
 public GPUModule (GPUModuleTarget target) : base(target)
 {
 }

 [Kernel]  //Same Error whether RecursionTest is another Kernel or not.
 public void RecursionTest(deviceptr<int> a)
 {
   ...
   RecursionTest(a);
 }

 [Kernel]
 public MyKernel(deviceptr<int> a, ...)
 {
   ...
   var a = __shared__.Array<int>(10);
   RecursionTest(Intrinsic.__array_to_ptr<int>(a)); //Error here
 }
 ...
}


如果您提供使用ALEA库的C#中的递归示例的任何文档或链接,我们将不胜感激。

提前致谢

最佳答案

您正在使用Alea GPU 2.x,最新版本是Alea GPU3.x。 (请参阅www.aleagpu.com)。使用3.0,我进行了测试,并且可以正常工作:

using Alea;
using Alea.CSharp;
using NUnit.Framework;

    public static void RecursionTestFunc(deviceptr<int> a)
    {
        if (a[0] == 0)
        {
            a[0] = -1;
        }
        else
        {
            a[0] -= 1;
            RecursionTestFunc(a);
        }
    }

    public static void RecursionTestKernel(int[] a)
    {
        var tid = threadIdx.x;
        var ptr = DeviceFunction.AddressOfArray(a);
        ptr += tid;
        RecursionTestFunc(ptr);
    }

    [Test]
    public static void RecursionTest()
    {
        var gpu = Gpu.Default;
        var host = new[] {1, 2, 3, 4, 5};
        var length = host.Length;
        var dev = gpu.Allocate(host);
        gpu.Launch(RecursionTestKernel, new LaunchParam(1, length), dev);
        var actual = Gpu.CopyToHost(dev);
        var expected = new[] {-1, -1, -1, -1, -1};
        Assert.AreEqual(expected, actual);
        Gpu.Free(dev);
    }

09-27 19:17