2017-01-29 9 views
2

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

«Fody/Alea.CUDA: AOTCompileServer вышел unexpectly с выходными кодом -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.

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

ответ

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); 
    } 
+0

Вот список версия для зависимостей 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 –

+0

Нет, это версии 2.2.0 (на самом деле, я думаю, вы немного перепутались с alea.dll, который исходит из версии 3, но остальные из версии 2), пожалуйста, перейдите по ссылке: http://www.quantalea.com/ (в меню «Продукты» есть ссылки на версию 3). –

+0

Да, это беспорядок, потому что потребовалось несколько недель, чтобы исправить ошибки компиляции, такие как weaver.xml. На веб-сайте ALEA недостаточно документации относительно процесса установки и возможных сообщений об ошибках. Поэтому мне пришлось произвольно попробовать разные настройки и версии. Прошу вас пройти через процесс установки, чтобы я мог реализовать кодирование графического процессора на основе экземпляров класса. Самые последние версии ALEA.CUDA и ALEA.CUDA.IL в Nuget - 2.2.0.3307. Версия ALEA.IL стала 3.0.0.0 теперь после переустановки через Nuget. Но я все равно получаю такое же сообщение об ошибке. –