Как использовать рекурсию с библиотекой ALEA в C#

Я пытаюсь преобразовать рекурсивный алгоритм с процессора на графический процессор, используя библиотеку ALEA. Я получаю следующие ошибки, если я создаю код:

"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
 }
 ...
}

Буду признателен, если вы предоставите какую-либо документацию или ссылку на примеры рекурсии на C# с использованием библиотеки ALEA.

заранее спасибо


person Mehmet Bingöl    schedule 29.01.2017    source источник


Ответы (1)


Вы используете Alea GPU 2.x, последней версией является Alea GPU 3.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);
    }
person Xiang Zhang    schedule 30.01.2017
comment
Вот список версий для зависимостей ALEA: ALEA.dll (v4.0.30319/3.0.0.0) ALEA.CUDA.dll (v4.0.30319/2.2.0.3307) Alea.CUDA.IL.dll (v4.0.30319/2.2.0.3307) ) Alea.IL.dll (v4.0.30319/2.2.0.3307) Я предполагаю, что это версия 3 - person Mehmet Bingöl; 30.01.2017
comment
Нет, это версия 2.2.0 (на самом деле, я думаю, вы немного запутались с alea.dll, которая исходит из версии 3, но остальные из версии 2), пожалуйста, перейдите сюда: quantalea.com (в меню "Продукты" есть ссылки на версию 3). - person Xiang Zhang; 30.01.2017
comment
Да, это беспорядок, потому что потребовались недели, чтобы исправить ошибки компиляции, такие как weaver.xml. На веб-сайте ALEA недостаточно документации, касающейся процесса установки и возможных сообщений об ошибках. Так что пришлось произвольно пробовать разные настройки и версии. Пожалуйста, проведите меня через процесс установки, чтобы я мог внедрить кодирование графического процессора на основе экземпляра класса. Последние версии ALEA.CUDA и ALEA.CUDA.IL в Nuget — 2.2.0.3307. Версия ALEA.IL теперь стала 3.0.0.0 после переустановки через Nuget. Но я все еще получаю то же сообщение об ошибке. - person Mehmet Bingöl; 30.01.2017
comment
Кстати большое спасибо за потраченное время на рабочий рекурсивный код. Я проверил это в своем проекте с приведенными выше ссылками, и это также сработало. Я предполагаю, что ошибка может быть связана с кодированием графического процессора на основе экземпляра класса и/или ссылками на CUDA. Можете ли вы попробовать такой пример для меня, пожалуйста? - person Mehmet Bingöl; 30.01.2017
comment
Кодирование на основе экземпляра класса есть в Alea V2.2. В V3 все намного проще. Посмотрите образцы в галерее. Для установки V3 см. здесь - person Daniel; 30.01.2017
comment
Посмотрев в окно вывода журнала сборки, я заметил следующую ошибку перед тем, как AOTCompileServer неожиданно завершил работу с кодом выхода -1073741571 ошибка: [ОШИБКА] System.Runtime.Remoting.RemotingException: Не удалось прочитать из порта IPC: канал был закончился. - person Mehmet Bingöl; 30.01.2017
comment
@XiangZhang, я преобразовал свой код в кодирование графического процессора на основе методов для рекурсии. Но мое приложение падает, если я пытаюсь его отладить. Если я закомментирую строку рекурсии, я смогу отладить. Он падает, если у меня есть какая-либо команда Console.Writeln. Я также получаю System.AccessViolationException, если обращаюсь к массиву a после RecursionTestFunc(a); Может быть, я должен задать это с новым вопросом. - person Mehmet Bingöl; 08.02.2017
comment
@MehmetBingöl, да, пожалуйста, задайте новый вопрос и поместите туда свой код, кстати, alea gpu версии 2.x больше не будет поддерживаться, я настоятельно рекомендую вам использовать версию 3.x - person Xiang Zhang; 09.02.2017
comment
@XiangZhang, это эталонные версии. Как понять, что я использую версию 2.x? Alea, Version=3.0.0.0 Alea.Cuda Version=2.2.0.3307 (это последняя версия git) Alea.IL, Version=3.0.0.0 Alea.Parallel, Version=3.0.0.0 FSharp.Core, Version=4.4.0.0 unit.framework Version = 2.6.3.13283 Вот что я получаю при установке через GIT - person Mehmet Bingöl; 09.02.2017
comment
@MehmetBingöl, я думаю, ты немного перепутал пакеты. Для AleaGPU 3.x существует всего два пакета: Alea и Alea.Fody. Пожалуйста, дважды проверьте свои пакеты, оставьте пакеты Alea и Alea.Fody и избавьтесь от всех других пакетов, таких как Alea.CUDA и т. д., они все старые. - person Xiang Zhang; 09.02.2017
comment
@XiangZhang, ALEA.CUDA используется в примерах, которые вы показали на своей странице Первая программа Alea GPU. ‹quantalea.com/static/app/tutorial/getting_started/› Я использую его для функции Common.divup. Есть ли более новая версия в 3.x? Я удалил другие ссылки. В них не было необходимости. - person Mehmet Bingöl; 09.02.2017