Вычисления на GPU C#

412
31 мая 2017, 02:14

Ради веселья начал искать числа Ферма, но скорость вычисления на процессоре меня не устраивает. У меня есть метод, который возводит value в степень exponent. bigint = System.Numerics.BigInteger.

static bigint PPow(int value, bigint exponent)
        {
            bigint result = bigint.One;
            int iterate = (int)(exponent / 1048560);
            Parallel.For(0, iterate, i =>
            {
                result *= bigint.Pow(value, 1048560);
                exponent -= 1048560;
            });
            result *= bigint.Pow(value, (int)exponent);
            return result;
        }

В менеджере пакетов Nuget скачал Alea и Alea.Foty, чтобы использовать GPU. Теперь код выглядит так.

[GpuManaged]
        static bigint PPow(int value, bigint exponent)
        {
            bigint result = bigint.One;
            int iterate = (int)(exponent / 1048560);
            Gpu.Default.For(0, iterate, i =>
            {
                result *= bigint.Pow(value, 1048560);
                exponent -= 1048560;
            });
            result *= bigint.Pow(value, (int)exponent);
            return result;
        }

Но у меня почему-то вылетает исключение:

System.Exception произошло
  HResult=0x80131500
  Сообщение = Non-default constructor(Void .ctor(Int32)) of System.Numerics.BigInteger is not supported in IL compiler.
Source location stack:
-> at System.Numerics.BigInteger.[System.Numerics.BigInteger op_Implicit(Int32)]
-> in C:\Users\10620\OneDrive\Документы\Visual Studio 2017\Projects\Finder\Finder\Program.cs(29,17-29,54)
-> at Finder.Program+<>c__DisplayClass2_0.[Void <PPow>b__0(Int32)]
-> at Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> at defining runtime64 (sm61,64bit)
Loading method as kernel:
-> Method: Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> InstanceOpt: <None>
-> Argument.#0: 0
-> Argument.#1: 0
-> Argument.#2: System.Action`1[System.Int32]
Getting or loading method as kernel:
-> Method: Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> InstanceOpt: <None>
-> Argument.#0: 0
-> Argument.#1: 0
-> Argument.#2: System.Action`1[System.Int32]
  Источник = Alea
  Трассировка стека:
   at Alea.Gpu.GetOrLoad(MethodInfo kernelMethodInfo, FSharpOption`1 instanceOpt, FSharpList`1 arguments)
   at Alea.CSharp.GpuExtensions.Launch[T1,T2,T3](Gpu this, Action`3 kernel, LaunchParam lp, T1 arg1, T2 arg2, T3 arg3)
   at Alea.Parallel.Device.DeviceFor.For(Gpu gpu, Int32 fromInclusive, Int32 toExclusive, Action`1 op)
   at Finder.Program.PPow(Int32 value, BigInteger exponent)
   at Finder.Program.Main(String[] args)

Как обойти это исключение?

READ ALSO
Как оптимизировать код

Как оптимизировать код

Имею следующее одоробло:

255
парсер сайтов на php

парсер сайтов на php

всем привет!

342
Как использовать Twig

Как использовать Twig

У меня небольшой проект (mvc,OOP)Покажите пожалуйста как правильно подключать Twig и как его использовать в controller

346
Привет кто поможет с Telegram bot? написано на PHP

Привет кто поможет с Telegram bot? написано на PHP

У меня есть бот который при приветствии отправляет id пользователяПомогите реализовать генерацию этого id с помощью QR кода и отправку пользователю...

350